【发布时间】:2013-10-11 13:23:45
【问题描述】:
Django 允许您指定会话在浏览器关闭时过期(对 Chrome 有一些警告)。为什么它不对 CSRF cookie 这样做?
我问是因为在我看来 CSRF 令牌很容易被泄露(例如,错误地将其放在外部站点的帖子中),这将是一种缓解措施。我是不是误会了什么?
【问题讨论】:
Django 允许您指定会话在浏览器关闭时过期(对 Chrome 有一些警告)。为什么它不对 CSRF cookie 这样做?
我问是因为在我看来 CSRF 令牌很容易被泄露(例如,错误地将其放在外部站点的帖子中),这将是一种缓解措施。我是不是误会了什么?
【问题讨论】:
这个问题之前已经提出并回答了on the django-developers mailing list。
【讨论】:
我将从 Carl 链接的开发人员列表中重新发布我的答案,以便 stackoverflow 也有它:
如果 cookie 设置为在浏览器关闭时过期,则会导致 CSRF 关闭浏览器(或使用 表单),然后从浏览器缓存中加载该页面,然后 提交了表格。我对这个用例是否是矛盾的 值得支持(例如,在移动设备上可能很重要), 但我不相信将cookie设置为在浏览器关闭时过期 为其他正确配置的设备提供了很多安全优势 站点(HTTPS、HSTS 等)。
Django 的 CSRF 实现不同于 [1] 与许多其他存储 CSRF 信息以及服务器上的会话信息。 CSRF 通过将表单中提供的令牌与 在浏览器中作为 cookie 提供的令牌。如果您将 cookie 设置为 'zzz',它仍然会很好地运行。安全来自 攻击者无法设置 cookie 的事实,而不是它发生的事实 包含任何特定的加密值。
如果担心攻击者可以访问用户的物理 会话之间的计算机并窃取 CSRF 令牌,将其设置为过期 在浏览器关闭时不会阻止攻击者插入 cookie 将在下一个会话期间使用的已知值。我不是 确信我们可以保护其计算机已被损坏的用户的令牌 被攻击者物理访问。
不过,如果可以令人信服地证明设置 cookie 在浏览器关闭时过期不会破坏现有的用例(移动 浏览器是我主要关心的)我愿意更改默认值 行为。如果任何非恶意用户,我们通常认为这是一个错误 可以通过无辜的行为触发 CSRF 警告。
[1] Django 的 CSRF 实现通常会引发各种错误 大多数渗透测试工具中的警报,因为它不能完全按照 其他实现方式相同,并且不依赖于会话 曲奇饼。
【讨论】: