这是Django的CSRF保护如何运作的?

时间:2012-07-23 15:48:22

标签: django django-csrf

作为cookie的初学者,CSRF和Django(使用1.4),从我可以看出它是如何工作的,请纠正我出错的地方......

以下适用于MIDDLEWARE_CLASSES元组中包含django.middleware.csrf.CsrfViewMiddleware的地方。

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

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

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

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

这是对的吗?

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分:0)

我会说你是对的。你会发现here我自己的表述。

总结:

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