不要理解Django的CSRF保护是如何运作的

时间:2016-11-04 19:48:03

标签: javascript django csrf django-csrf

读取这个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   是随机的,每页链接动态呈现。

2 个答案:

答案 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是有意义的。但这不是出于安全原因。