【问题标题】:Does Django use per-page or per-session CSRF?Django 使用每页还是每会话 CSRF?
【发布时间】:2020-05-09 14:01:15
【问题描述】:

我想知道用于 CSRF 生成的默认 Django 策略是什么?它们是按页面还是按会话创建的?如果是每次会话,为什么选择它?是不是比每页 CSRF 更安全?

【问题讨论】:

    标签: django csrf django-csrf


    【解决方案1】:

    它们是按页面还是按会话创建的?

    来自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

    【讨论】:

      【解决方案2】:

      通读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,它们真的很有帮助。

      【讨论】:

        猜你喜欢
        • 2015-05-07
        • 2011-05-23
        • 1970-01-01
        • 2020-09-24
        • 2013-11-19
        • 1970-01-01
        • 2019-11-04
        • 2011-07-25
        • 1970-01-01
        相关资源
        最近更新 更多