我对 django 中的 CSRF 保护一无所知。例如我们有一些恶意网站。将 get-request 从该站点发送到受 csrf 保护的 url,解析页面并获取 csrf 值,然后使用此值发布有什么问题?
3 回答
例如我们有一些恶意网站。将 get-request 从该站点发送到受 csrf 保护的 url,解析页面并获取 csrf 值,然后使用此值发布有什么问题?
如果您这样做,CSRF cookie 的会话副本将不匹配,并且您的请求将被拒绝。
此外,应该注意的是,仅针对 HTTPS 请求进行引荐来源网址检查,以防止MitM漏洞。
有关CSRF 保护如何工作的讨论,请参阅这个 django wiki 条目,以及专门讨论 MitM 攻击的这个 SO question。
Django 的 CSRF 的主要目的在 Django Docs (https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#how-it-works) 中有解释:
这可确保只有源自您网站的表单才能用于 POST 回数据。
所以它会检查几件事——cookie、referrer、posted value。并且有一些限制,您不能总是随意修改所有这些值。例如 - 您可以在 AJAX 调用中设置 X-CSRFToken 令牌和 POST 值,但浏览器不允许您覆盖引用标头...您可能会成功使用 urllib2 或类似库成功执行 POST,但这不受 CSRF 保护的影响,因为它与您在页面上发布的内容相同。再一次 - CSRF 意味着跨站点请求伪造,它是它所保护的。
REFERRER 将被检查。如果 REFERRER 确实对应于正确的 URL,则 POSTing 数据无效。