读取这个section of the Django docs,他们建议在cookie中设置一个csrftoken,然后让客户端框架将它放在一个标题中,该标题将在服务器端请求中进行验证。但是,在cookie中没有令牌会使目的失败,因为cookie是根据每个用户的请求发送的?
或者是"安全"这里Django在标头中检查该值而不是检查cookie值本身?
我确实理解为什么这适用于同步提交,但在这种情况下,csrftoken直接写入页面而不是存储在cookie中,这似乎更安全。
来自OWASP page on reviewing code for CSRF:
检查请求是否有有效的会话cookie是不够的,我们 需要检查是否在发送的每个HTTP请求中发送了唯一标识符 到申请。 CSRF要求WON&T具有此有效唯一性 标识符。 CSRF请求的原因是没有这个独特的请求 identifier是唯一ID,在页面上呈现为隐藏字段 按下链接/按钮后附加到HTTP请求 选择。攻击者不会知道这个唯一ID 是随机的,每页链接动态呈现。
答案 0 :(得分:3)
你误解了一些事情。
令牌总是在cookie中;你链接到的代码是为了让它在你的JS中 out ,你可以把它发回去。
正如您的报价所示,攻击者试图从不在网站上的网页发帖的人不会拥有该cookie,因此无法将正确的值注入表单或者报头中。
答案 1 :(得分:0)
我不熟悉django csrf保护,但我认为它的工作方式与其他框架中的其他csrf保护一样。
诀窍是,通过cookie将csrf令牌发送到客户端,客户端使用头将其发送回服务器。服务器忽略cookie,但不忽略标头。它如何防止csrf攻击?例如,攻击者可以绑定<img src="yourwebsite.com/action/destroy/data">
(或通过javascript发送发布请求)。您的浏览器会随之发送csrf cookie(以及会话cookie)。因为标题丢失 - 防止了攻击。
与表格相同。我认为两者,标题和表格都是平等安全的。
但是如果你有xss漏洞,那么在这两种情况下你都会丢失。
编辑:丹尼尔指出,删除csrf cookie是有意义的。但这不是出于安全原因。