我有一个Django站点,它使用Django的csrf-token来防止csrf攻击 . 其中一个表格可以由公众访问,包括尚未登录的人 .
Csrf Token应该提供针对跨域请求的保护 .
Edit: (引自我的评论)"But, in case of post requests that are allowed without requiring authorization, csrf is no better than a trival spam filter(captcha would do better here). In fact, it should be a security risk to include CSRF token(that expire after say, 30 mins) in pages that require no authentication what so ever.(but my site is doing it, which is why I made this post in the first place)"
此外,在这种情况下,可以在浏览器js控制台中获取该页面,通过某个特定的xpath获取csrf令牌,然后使用该csrf发布一些任意数据 . 此外,步骤易于重现,人们可以设计针对该网站的特定攻击,或任何Django网站,因为你每次都会找到除了_952906之外的csrf令牌(包括像reddit,pinterest等网站) .
据我所知,除了让它有点困难之外,csrf令牌并没有多大帮助 .
是否有一个方面,我失踪了?我的实施错了吗?如果我是正确的,让你的csrf令牌在你的html源代码中飞来飞去是愚蠢的(特别是那些不需要任何身份验证的人)?
2 回答
This question有很多关于同样事情的答案 . 此外,那里的最后一个答案解决了这样一个事实:它在技术上可以刮掉令牌的形式(通过javascript),然后用它提交一个帖子请求(通过javascript) . 但受害者必须登录 .
CSRF保护的目的是专门防止欺骗随机用户 . 它与客户端漏洞无关 . 您还必须考虑保护的一部分包括拒绝跨站点原始请求 . 该请求必须来自与目标站点相同的来源 .
总而言之,CSRF具有 Value . 它是一个保护区,但它不是最终的全部 . 你不能防御一切 .
引自a blog post about CSRF:
......以及感兴趣的评论:
如果您的表单是公开的并且不需要身份验证,则不会阻止任何人(包括恶意站点/插件/人员)发布到该表单 . 这个问题被称为垃圾邮件,而不是CSRF .
阅读本文:http://en.wikipedia.org/wiki/Cross-site_request_forgery
CSRF涉及通过 pretending to be an authenticated user 向您的表单发布恶意站点 .