Django CSRF Coo​​kie - 为什么它不会在浏览器关闭时到期?

时间:2013-10-04 13:52:42

标签: django csrf

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

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

2 个答案:

答案 0 :(得分:9)

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

如果cookie设置为在浏览器关闭时到期,则会导致CSRF 关闭浏览器的用户的错误(或使用 在它上面的形式)然后从浏览器缓存加载该页面 提交了表格。我对这个用例是否存在矛盾 值得支持(例如,在移动设备上可能很重要), 但我不认为将cookie设置为在浏览器关闭时到期 为其他正确配置提供了很多安全性好处 网站(HTTPS,HSTS等)。

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

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

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

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

答案 1 :(得分:3)

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