673 字
3 分钟
Web 安全常见攻击面与 Celery 异步任务
时效注记(2026 更新):本文是 2019 年的学习笔记。安全部分的结论至今有效,只有一处依赖变了——文中提到的
djangorestframework-jwt已停止维护多年,现在应使用djangorestframework-simplejwt。
生成用户令牌(token)
- 哈希码 —— MD5 / SHA1(已不适合做安全用途,仅做标识可以)
- UUID —— 全局唯一标识符
- JWT —— JSON Web Token,Django 生态下用
djangorestframework-simplejwt
两个常见用途:
- 防表单重复提交:每一次请求刷新令牌
- 防跨站请求伪造(CSRF / XSRF)
XSS —— 跨站脚本攻击
用户在评论里输入的是 JS 代码,页面渲染时被执行。处理方式是「消毒」:
-
清理用户输入,过滤 JS 代码和特殊字符:
<>尖括号;分号"引号()括号'单引号&and 符号%百分号+加号 -
输出时做 HTML 编码,而不是存储时才处理。以 ASP.NET 的 AntiXSS 类库为例:
// 编码后只会原样显示,不会弹框this.lblName.Text = Encoder.HtmlEncode("<script>alert('OK');</script>"); -
响应头加上
X-Content-Type-Options: nosniff,避免浏览器「自作聪明」地嗅探并按可执行类型解析内容。
SQL 注入
- 不用字符串拼接 SQL,一律用参数化查询 / ORM
- 应用连接数据库不要用管理员权限账号
- 避免动态拼接表名、列名;必须动态时用白名单
点击劫持(clickjacking)
攻击者用 iframe 嵌套你的网页并把透明度设为 0,诱导用户在看不见的页面上点击。
对策是响应头 X-Frame-Options: DENY(Django 里配置 X_FRAME_OPTIONS = 'DENY'),现代写法是 CSP 的 frame-ancestors 'none'。
密码存储
密码原文 → 加盐 → 生成哈希摘要。注意要用 bcrypt / scrypt / Argon2 这类慢哈希,别用 MD5、SHA1。
Web 应用优化的两大定律
- 使用缓存 —— 适合缓存的数据特点:数据量不大、属于热点、值不会频繁修改
- 能推迟的事情都不马上做 —— 用消息队列削峰、给上下游节点解耦
消息队列让任务异步化
- 同步 —— 阻塞
- 异步 —— 非阻塞
Celery
Celery 既可以充当消息的生产者,也可以充当消费者。使用时需要为其配置队列服务:RabbitMQ(推荐)或 Redis。支持定时任务 + 异步任务。
什么样的任务适合放进队列:
- 不需要马上返回结果的,比如下订单——下单系统和受理订单的系统可以是两套程序,分别跑在不同服务器上
- 执行时间无法预期的,比如调用第三方平台
受理用户请求的程序作为生产者把任务丢进队列,稍后由消费者取出处理。
Web 安全常见攻击面与 Celery 异步任务
https://gilgameshzzz.github.io/posts/笔记/ 





