今天我了解到 Django 的 CSRF 保护除了检查隐藏的表单字段与 cookie 外,还使用了refer(r)er 标头检查。从下面的文档和问题来看,这似乎很重要。
它只通过 HTTPS 进行检查。我还注意到几乎没有其他网站检查引用者[因为我关闭了所述标题的发送并且大多数表单仍然有效]。
所以我有两个问题:
- 如果没有这项检查,攻击将如何进行?https 不能防止中间人攻击吗?
- 其他网站如何防范它?Django 不是为 http 项目吗?
我找到的信息:
https://docs.djangoproject.com/en/1.8/ref/csrf/#how-it-works
此外,对于 HTTPS 请求,严格的 referer 检查由 CsrfViewMiddleware 完成。这对于解决在 HTTPS 下使用独立于会话的 nonce 时可能发生的中间人攻击是必要的,因为 HTTP 'Set-Cookie' 标头(不幸地)被正在与HTTPS 下的站点。(对 HTTP 请求不进行引用检查,因为在 HTTP 下引用头的存在不够可靠。)
https://code.djangoproject.com/ticket/16870
不幸的是,这个检查对于 Django 的 CSRF 保护的安全性是绝对必要的。没有它,我们就无法防止对 SSL 站点的中间人攻击。我们决定,对于以不会改善隐私的方式阻止标题的少数用户来说,阻止 MITM 比破坏网站更有价值。