【问题标题】:Django CSRF Cookie -- why doesn't it expire at browser close?Django CSRF Coo​​kie——为什么它不会在浏览器关闭时过期?
【发布时间】:2013-10-11 13:23:45
【问题描述】:

Django 允许您指定会话在浏览器关闭时过期(对 Chrome 有一些警告)。为什么它不对 CSRF cookie 这样做?

我问是因为在我看来 CSRF 令牌很容易被泄露(例如,错误地将其放在外部站点的帖子中),这将是一种缓解措施。我是不是误会了什么?

【问题讨论】:

    标签: django csrf


    【解决方案1】:

    这个问题之前已经提出并回答了on the django-developers mailing list

    【讨论】:

      【解决方案2】:

      我将从 Carl 链接的开发人员列表中重新发布我的答案,以便 stackoverflow 也有它:

      如果 cookie 设置为在浏览器关闭时过期,则会导致 CSRF 关闭浏览器(或使用 表单),然后从浏览器缓存中加载该页面,然后 提交了表格。我对这个用例是否是矛盾的 值得支持(例如,在移动设备上可能很重要), 但我不相信将cookie设置为在浏览器关闭时过期 为其他正确配置的设备提供了很多安全优势 站点(HTTPS、HSTS 等)。

      Django 的 CSRF 实现不同于 [1] 与许多其他存储 CSRF 信息以及服务器上的会话信息。 CSRF 通过将表单中提供的令牌与 在浏览器中作为 cookie 提供的令牌。如果您将 cookie 设置为 'zzz',它仍然会很好地运行。安全来自 攻击者无法设置 cookie 的事实,而不是它发生的事实 包含任何特定的加密值。

      如果担心攻击者可以访问用户的物理 会话之间的计算机并窃取 CSRF 令牌,将其设置为过期 在浏览器关闭时不会阻止攻击者插入 cookie 将在下一个会话期间使用的已知值。我不是 确信我们可以保护其计算机已被损坏的用户的令牌 被攻击者物理访问。

      不过,如果可以令人信服地证明设置 cookie 在浏览器关闭时过期不会破坏现有的用例(移动 浏览器是我主要关心的)我愿意更改默认值 行为。如果任何非恶意用户,我们通常认为这是一个错误 可以通过无辜的行为触发 CSRF 警告。

      [1] Django 的 CSRF 实现通常会引发各种错误 大多数渗透测试工具中的警报,因为它不能完全按照 其他实现方式相同,并且不依赖于会话 曲奇饼。

      【讨论】:

      • 感谢您的回答。问题不在于攻击者访问用户的物理计算机,而在于缓解 CSRF 令牌的潜在泄漏。我在这里没有看到任何缓解措施。
      • 如果您对可能意外泄漏 CSRF 令牌的方法有任何想法,我想通过电子邮件了解它们。除了故意的错误代码(将受 CSRF 保护的表单发布到另一个站点,或允许用户创建此类表单或控制发布目标)之外,我不知道有这样的事情。
      • 我很好奇用户在公共计算机上的情况。除非我误解了整个过程,否则攻击者不能跳上公共计算机并获取令牌,然后尝试使用同一终端欺骗某人吗?那时,攻击者将拥有 csrftoken(因为它不会在关闭时过期并且与会话无关),并且制作请求很容易。如果我没有遗漏一些简单的东西,我们如何防止这种情况发生?
      • 忽略我的最后评论 - 我正在使用 Django 的 beta 版本进行开发,该版本必须禁用此功能。升级到 1.6 的发布版本会在每个新会话上重新启用不断变化的 csrf 令牌。
      猜你喜欢
      • 2018-12-30
      • 2013-07-16
      • 2016-04-19
      • 2012-02-12
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      • 2017-01-04
      相关资源
      最近更新 更多