【问题标题】:Is it a security risk to include 'CSRF token' in pages requiring no authentication?在不需要身份验证的页面中包含“CSRF 令牌”是否存在安全风险?
【发布时间】:2012-06-13 08:50:11
【问题描述】:

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

Csrf Token 应该可以防止跨域请求。

编辑:(引用我的评论) “但是,在不需要授权的情况下允许发布请求的情况下,csrf 并不比一个简单的垃圾邮件过滤器更好(验证码在这里会做得更好)。事实上,包含 CSRF 令牌应该是一个安全风险(说后过期) , 30 分钟)在不需要身份验证的页面中。(但我的网站正在这样做,这就是我首先发布这篇文章的原因)”

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

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

我缺少它的某个方面吗?我的实施错了吗?如果我是对的,让你的 csrf 令牌在你的 html 源中到处乱飞是愚蠢的吗(尤其是那些不需要任何身份验证的)?

【问题讨论】:

  • 您描述的攻击他人的过程是怎样的?似乎您只是作为会话的所有者执行手动客户端发布。
  • 是的,但前提是我这样做。如果它是安装在某人浏览器中的恶意插件,则该插件可以通过简单的 get 请求获取表单,获取 csrf 令牌并使用它发布表单。如果某些不需要身份验证但包含表单(带有 csrf 令牌)的 GET 请求,似乎很容易绕过 csrf。
  • 它不应该是对恶意插件的防御。这是对跨站点请求伪造的防御,因此得名。
  • 那么它实际上提供了什么安全性?人们可以强化 csrf,也可以强化会话,那么它如何使它更安全?

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


【解决方案1】:

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

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

底线,CSRF 是有价值的。它是一个保护区域,但不是全部。而且你不能防御一切。

引用a blog post about CSRF:

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

...和感兴趣的cmets:

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

  • 大卫·古德温 2008 年 9 月 24 日凌晨 2:35

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

  • Rico 于 2008 年 9 月 24 日凌晨 3:03

【讨论】:

  • 谢谢,看来我对 csrf 令牌的实际作用有错误的认识,此外,第一个链接中的 OP 也有类似的疑问。
  • 事实上,我们可以说这个问题可能与stackoverflow.com/questions/10242263/… 重复,但问题的标题看起来很不一样。
【解决方案2】:

如果您的表单是公开的并且不需要身份验证,那么没有什么可以阻止任何人(包括恶意网站/插件/人员)向其发帖。这个问题被称为垃圾邮件,而不是 CSRF。

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

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

【讨论】:

  • 对不起,我并没有具体说明我的疑问,我已经编辑了我的问题,我已经阅读了 csrf wiki 页面,它不能解决我的疑问。跨度>
猜你喜欢
  • 2021-02-21
  • 2019-03-21
  • 1970-01-01
  • 2020-03-15
  • 2018-09-27
  • 1970-01-01
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多