理解表格中的django隐藏字段和CSRFCookie中的csrf

时间:2012-03-30 03:21:24

标签: django csrf

我在csrf protcetion写下了对django机制的理解。如果错误,请纠正我。

csrfViewMiddleware创建一个唯一的字符串,并将其存储在源自主机的表单的隐藏字段“csrfmiddlewaretoken”中。因为模仿此表单的恶意网站将不知道此字段的值,它不能用它。

当有人试图发布表单时,网站会检查“csrfmiddlewaretoken”字段及其值。如果错误或未设置,则会检测到csrf尝试。

但是,CSRFCookie究竟是什么? The doc表示唯一值在CSRFCookie以及hidden field中设置。这是我感到困惑的地方。是否会将嵌入了唯一字符串的Cookie发送到浏览器?我希望有人可以清楚地解释一下。

谢谢,

2 个答案:

答案 0 :(得分:5)

好的,我的解释如下:

Django为经过身份验证的用户分配存储在cookie中的CSRF令牌。每次用户发出被认为“不安全”的请求(即POST,PUT,DELETE)时,都会读取此cookie中的值,以验证用户(而非恶意第三方)正在发出请求。

您放置在表单中的CSRF标记实际上从cookie中获取CSRF令牌,然后在您提交表单时将其作为POST变量传递。

希望这会让它更清晰一点。

答案 1 :(得分:1)

根据我目前的理解,我对经过验证的答案并不完全满意。

您可以找到我的here版本。

总而言之,CSRFCookie是“安全的”,因为攻击者因同源政策而无法访问它。浏览器将自动发送此值。现在,您的表单还必须发送此值(例如,在隐藏字段中)。这意味着您的表单必须知道此值,并且可以从cookie中获取它。

攻击者无法从cookie中获取令牌,因此无法伪造包含令牌的恶意代码。

最重要的是,用户可以发送csrf令牌,服务器可以验证它。使用cookie是一种方便的方法,但这可以以不同的方式实现(例如,服务器可以为每个会话保存CSRF令牌)。

我不是专家,但这就是我理解的方式。希望它有所帮助。