10

作为 cookie、CSRF 和 Django(使用 1.4)的初学者,据我所知,这是它的工作原理,请纠正我哪里出错了......

以下适用于 django.middleware.csrf.CsrfViewMiddleware 包含在 MIDDLEWARE_CLASSES 元组中的情况。

如果 POST 表单包含csrf_token标签,并且相关视图传递RequestContext给模板,则请求页面意味着 Django 包含一个包含字母数字字符串的隐藏表单字段。Django 还向浏览器返回一个名称设置为csrftoken和值设置为相同字母数字字符串的 cookie。

收到表单提交时,Django 检查隐藏表单字段中的字母数字字符串值是否与从浏览器接收到的 csrftoken cookie 匹配。如果它们不匹配,则会发出 403 响应。

CSRF 攻击可能以包含 iframe 的恶意网站的形式出现。iframe 包括一个 POST 表单和一些 JavaScript。表单的action属性指向我的 Django 站点。该表单旨在在我的站点上做一些讨厌的事情,并且 JS 在加载 iframe 时提交表单。

浏览器会csrftoken在表单提交的标题中包含 cookie。但是,表单不会包含具有匹配字母数字字符串的隐藏字段,因此返回 403 并且攻击失败。如果 iframe JS 试图访问 cookie,以创建正确的隐藏表单字段,浏览器会阻止它这样做。

它是否正确?

4

2 回答 2

1

我认为官方 Django 文档中描述了您想要的内容。 https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#how-it-works

当我尝试时,上面的链接被破坏了,但对于 1.7 版,这有效: https ://docs.djangoproject.com/en/1.7/ref/contrib/csrf/

于 2012-09-12T01:23:14.280 回答
1

我会说你是对的。你会在这里找到我自己的表述。

总结一下:

  • CSRF 令牌是从代码中发送的,这意味着恶意代码必须知道它。
  • CSRF 令牌存储在 cookie 中并由浏览器发送。
  • 由于同源策略,攻击者无法访问cookie。
  • 服务器可以简单地验证来自 cookie 的“安全”值是否与来自代码的值相同。
于 2014-05-23T05:30:19.940 回答