不理解django的CSRF保护是如何工作的

Don't understand how Django's CSRF protection works

本文关键字:工作 何工作 django CSRF 保护 不理解      更新时间:2023-09-26

阅读这部分Django文档,他们建议在cookie中设置一个csrftoken,然后让客户端框架将其放在一个头文件中,该头文件将在服务器端请求中进行验证。但是,在cookie中使用令牌不会破坏目的吗?因为cookie是根据每个用户的请求发送的。

或者这里的"安全"是Django在头文件中检查该值而不是检查cookie值本身?

我确实理解为什么这适用于同步提交,但在这种情况下,csrftoken直接写入页面而不是存储在cookie中,这似乎更安全。

来自OWASP关于审核CSRF代码的页面:

检查请求是否有一个有效的会话cookie是不够的,我们需要检查每个HTTP请求是否发送了唯一标识符到应用程序。CSRF请求不会有这个有效的惟一标识符。CSRF请求没有这个唯一请求的原因标识符是唯一的ID,呈现为页面上的隐藏字段并在链接/按钮按下后附加到HTTP请求中选中。攻击者将不知道这个唯一的ID,因为它是随机的,每个链接,每个页面动态呈现。

你误解了一些事情。

令牌总是在cookie中;你链接到的代码是用来把它从你的JS中的cookie中取出来,这样你就可以把它发送回来了。

关键是,正如你的引言所示,攻击者试图从不在网站上的页面发布将没有该cookie,因此将无法注入正确的值到表单或标题。

我不熟悉django csrf保护,但我认为它的工作原理与其他框架中的其他csrf保护类似。

诀窍是,通过cookie向客户端发送csrf令牌,客户端使用header将其发送回服务器。服务器忽略cookie,但不忽略header。如何防止csrf攻击?例如,攻击者可以绑定<img src="yourwebsite.com/action/destroy/data">(或者通过javascript发送post请求)。浏览器会发送csrf cookie(以及会话cookie)。

表单也是一样。我认为头文件和表单同样安全。

但是在这两种情况下,如果你有xss漏洞,你就输了。

编辑:正如Daniel指出的,删除csrf cookie是有意义的。但这不是出于安全考虑。