在不需要身份验证的页面中包含“CSRF令牌”是否存在安全风险?

时间:2012-06-09 18:04:06

标签: django security csrf django-csrf csrf-protection

我有一个Django站点,它使用Django的csrf-token来防止csrf攻击。其中一个表格可以由公众访问,包括尚未登录的人。

Csrf Token应该提供针对跨域请求的保护。

修改(引自我的评论) “但是,如果在不需要授权的情况下允许发布请求,csrf并不比trival垃圾邮件过滤器更好(验证码会在这里做得更好)。事实上,包含CSRF令牌(在说完后过期)应该存在安全风险,30分钟)页面不需要任何身份验证。(但我的网站正在这样做,这就是为什么我首先发表这篇文章)“

此外,在这种情况下,可以在浏览器js控制台中获取该页面,通过某个特定的xpath获取csrf令牌,然后使用该csrf发布一些任意数据。此外,步骤易于重现,可以设计针对该网站的特定攻击,或任何Django网站,因为您每次都会找到除'csrfmiddlewaretoken'之外的csrf令牌(并且包括reddit,pinterest等。)。

据我所知,除了让它有点困难之外,csrf令牌并没有多大帮助。

我缺少一个方面吗?我的实施错了吗?如果我是正确的,让你的csrf令牌在你的html源代码中飞来飞去是愚蠢的(特别是那些不需要任何身份验证的人)?

2 个答案:

答案 0 :(得分:3)

This question对同一件事有很多好的答案。此外,那里的最后一个答案解决了这样一个事实,即技术上可以刮取令牌的形式(通过javascript),然后用它提交一个帖子请求(通过javascript)。但受害者必须登录。

CSRF保护的目的是专门防止欺骗随机用户。它与客户端漏洞无关。您还必须考虑保护的一部分包括拒绝跨站点原始请求。该请求必须来自与目标站点相同的来源。

底线,CSRF具有价值。它是一个保护区,但它不是最终的全部。你无法抵御一切。

引自a blog post about CSRF

  

秘密隐藏的表单值。使用发送一个唯一的服务器表单值   每个表单 - 通常与用户会话绑定 - 并验证   你在表格帖子中得到相同的价值。攻击者不能   只需通过JavaScript抓取您的远程表单作为目标用户,   感谢XmlHttpRequest函数中的相同域请求限制。

......感兴趣的评论:

  

我不是javascript向导,但是可以加载远程页面   在恶意页面上隐藏的iframe中,用javascript解析它   找到隐藏的令牌,然后填充用户的表单   (大概)即将提交正确的价值观?

     
      
  • David Goodwin于2008年9月24日上午2:35
  •   
     

@David Goodwin:不,同源策略可以防止恶意攻击   阅读iframe内容的页面。

     
      
  • Rico于2008年9月24日上午3:03
  •   

答案 1 :(得分:0)

如果您的表单是公开的并且不需要身份验证,则不会阻止任何人(包括恶意网站/插件/人员)发布到该表单。这个问题叫做垃圾邮件,而不是CSRF。

阅读本文:http://en.wikipedia.org/wiki/Cross-site_request_forgery

CSRF涉及通过假装为经过身份验证的用户向您的表单发布恶意网站。