673 字
3 分钟
Web 安全常见攻击面与 Celery 异步任务

时效注记(2026 更新):本文是 2019 年的学习笔记。安全部分的结论至今有效,只有一处依赖变了——文中提到的 djangorestframework-jwt 已停止维护多年,现在应使用 djangorestframework-simplejwt

生成用户令牌(token)#

  • 哈希码 —— MD5 / SHA1(已不适合做安全用途,仅做标识可以)
  • UUID —— 全局唯一标识符
  • JWT —— JSON Web Token,Django 生态下用 djangorestframework-simplejwt

两个常见用途:

  1. 防表单重复提交:每一次请求刷新令牌
  2. 防跨站请求伪造(CSRF / XSRF)

XSS —— 跨站脚本攻击#

用户在评论里输入的是 JS 代码,页面渲染时被执行。处理方式是「消毒」:

  1. 清理用户输入,过滤 JS 代码和特殊字符:

    < > 尖括号; 分号
    " 引号() 括号
    ' 单引号& and 符号
    % 百分号+ 加号
  2. 输出时做 HTML 编码,而不是存储时才处理。以 ASP.NET 的 AntiXSS 类库为例:

    // 编码后只会原样显示,不会弹框
    this.lblName.Text = Encoder.HtmlEncode("<script>alert('OK');</script>");
  3. 响应头加上 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 应用优化的两大定律#

  1. 使用缓存 —— 适合缓存的数据特点:数据量不大、属于热点、值不会频繁修改
  2. 能推迟的事情都不马上做 —— 用消息队列削峰、给上下游节点解耦

消息队列让任务异步化#

  • 同步 —— 阻塞
  • 异步 —— 非阻塞

Celery#

Celery 既可以充当消息的生产者,也可以充当消费者。使用时需要为其配置队列服务:RabbitMQ(推荐)或 Redis。支持定时任务 + 异步任务。

什么样的任务适合放进队列:

  • 不需要马上返回结果的,比如下订单——下单系统和受理订单的系统可以是两套程序,分别跑在不同服务器上
  • 执行时间无法预期的,比如调用第三方平台

受理用户请求的程序作为生产者把任务丢进队列,稍后由消费者取出处理。

参考:https://www.cnblogs.com/derek1184405959/p/8722212.html

Web 安全常见攻击面与 Celery 异步任务
https://gilgameshzzz.github.io/posts/笔记/
作者
Amadeus
发布于
2019-02-28
许可协议
CC BY-NC-SA 4.0