CSRF 是什么
CSRF 即跨站请求伪造,在用户不知情的情况下向有漏洞的网站发送请求。例如有正常网站A,恶意网站B, 用户若对A B 两个网站都有访问,B 可能伪造请求到 A,比如提交表单。至于具体的做法还有 CSRF 和 XSS 的区别,我决定另写一篇。。。
Django CSRF 主要处理流程
- 请求到达 Django 在调用 view 之前调用 csrf middleware 的 process_view 函数
- process_view 函数检查是否存在 csrf token, 不存在则设置新的 token
- 如果请求类型不是 '安全的'(见 RFC2616 如 POST),会有几项检查:
- 若是 https,# todo
- 若传入的 token 不存在,返回 403
- 若为请求类型为 post,会检查表单中的 token 与 cookie 中 token 是否一致, 不一致则 403
- 相关的 view 处理完后, 向用户返回 response 之前 调用 process_response 函数
- process_response 函数取得 request 中的 token 赋给 response 并更新 max_age 等信息
其他注意的地方
如果用户在 csrf token 过期前向服务器发出请求那么这个 token 值 正常情况下是一直不变的,需要手动更新的话可以用 rotate_token 函数