【发布时间】:2020-05-09 14:01:15
【问题描述】:
我想知道用于 CSRF 生成的默认 Django 策略是什么?它们是按页面还是按会话创建的?如果是每次会话,为什么选择它?是不是比每页 CSRF 更安全?
【问题讨论】:
标签: django csrf django-csrf
我想知道用于 CSRF 生成的默认 Django 策略是什么?它们是按页面还是按会话创建的?如果是每次会话,为什么选择它?是不是比每页 CSRF 更安全?
【问题讨论】:
标签: django csrf django-csrf
它们是按页面还是按会话创建的?
来自Django's official documentation:
一个基于随机秘密值的 CSRF cookie,其他网站无法访问。
此 cookie 由 CsrfViewMiddleware 设置。如果尚未在请求中设置它,则它与调用 django.middleware.csrf.get_token()(内部用于检索 CSRF 令牌的函数)的每个响应一起发送。
为了防止BREACH攻击,令牌不仅仅是秘密;一个随机盐被添加到秘密中并用于对其进行加扰。
出于安全原因,每次用户登录时都会更改密钥的值
这意味着用于生成 CSRF 令牌的secret 是生成per-session(有点)。
在验证“csrfmiddlewaretoken”字段值时,仅将秘密而非完整令牌与 cookie 值中的秘密进行比较。这允许使用不断变化的令牌。虽然每个请求都可以使用自己的令牌,但秘密对所有人来说都是公用的。
这项检查由 CsrfViewMiddleware 完成。
这意味着如果我们愿意,我们可以根据需要生成不同的 CSRF 令牌(例如per-page),但秘密将保持不变。
您可能还想阅读Radwan's answer。
【讨论】:
通读Django's Official Documentation about CSRF真的很有帮助
它解释了它是如何在内部作为中间件工作的,如果你去这个section,第 3 点
对于所有未使用 HTTP GET、HEAD、OPTIONS 或 TRACE 的传入请求,必须存在 CSRF cookie,并且“csrfmiddlewaretoken”字段必须存在且正确。如果不是,用户将收到 403 错误。
在验证“csrfmiddlewaretoken”字段值时,仅将秘密而非完整令牌与 cookie 值中的秘密进行比较。这允许使用不断变化的令牌。虽然每个请求都可以使用自己的令牌,但秘密对所有人来说都是公用的。
这项检查由 CsrfViewMiddleware 完成。
这意味着您可以灵活地为每页生成令牌。
如果您的要求强制在每个请求/页面上生成新的 csrf 令牌,请查看 this question and its answers,它们真的很有帮助。
【讨论】: