{% csrf_token %} 渲染的那串字符是什么?为什么每次刷新都不一样却都能通过?登录之后为什么旧页面的表单提交会 403?这篇用真实的 CSRF 中间件把这些行为逐个验证。
cookie csrftoken 长度 = 32 两次请求的 cookie 相同: True 表单 token 长度 = 64 两次请求的表单 token 相同: False CSRF_COOKIE_NAME = csrftoken CSRF_HEADER_NAME = HTTP_X_CSRFTOKEN CSRF_USE_SESSIONS = False
服务端不需要存储 token:cookie 里的 secret 就是依据。表单里的 token 是「掩码 + 密文」,每次不同,但解出的 secret 一致。
token 不同但都有效: True [200, 200] 没带 token → status 403 | CSRF verification failed. Request aborted. 错误的 token → status 403 | CSRF verification failed. Request aborted. 没有 cookie(新会话)但带了别人的 token → status 403 用请求头 X-CSRFToken 传 token → status 200
403 页面上具体的失败原因文案本文没有逐个测;测试里必须用 Client(enforce_csrf_checks=True),否则测试客户端默认跳过 CSRF。
GET 不检查 CSRF: 200 POST /login/ → 200 in 登录前后 csrftoken cookie 相同: False 前: G36cMUy2… 后: JuBxE4Ei… 登录前拿到的旧表单 token 还能用吗: 403 用登录后的新 token: 200 POST /logout/ → 200 退出前后 cookie 相同: True
登录后轮换 token 是防止「会话固定」类的攻击。副作用:用户在登录前打开的其它标签页里的表单会失效。