使用会话令牌或随机数进行跨站点请求伪造保护(CSRF)?

时间:2011-08-03 14:51:45

标签: php xss csrf csrf-protection

我继承了一些最近遭到攻击的代码,攻击者发送了重复的远程表单提交。

我使用会话身份验证令牌为每个用户(而不是会话ID)创建了。虽然我意识到这个特定的攻击不是CSRF,但我从这些帖子中调整了我的解决方案(尽管已过时)。

然而,它仍然觉得这里存在一些漏洞。虽然我知道没有什么是100%安全的,但我有一些问题:

  • 潜在攻击者是否只能启动有效会话,然后在每个请求中包含会话ID(通过cookie)?
  • 似乎 nonce 会比会话令牌更好。生成和跟踪 nonce 的最佳方式是什么?
  • 我遇到了一些关于这些解决方案只是单一窗口的观点。有人可以详细阐述这一点吗?
  • 这些解决方案总是需要会话吗?或者这些令牌可以在没有会话的情况下创建吗? 更新,此特定页面只是一个页面形式(无需登录)。因此,仅仅为了生成令牌而开始会话似乎过度了。
  • 是否有一个更简单的解决方案(不是CAPTCHA)我可以实施以防止这种不会使用会话的特定攻击。

最后,我正在寻求更好的理解,以便我可以实施更强大的解决方案。

1 个答案:

答案 0 :(得分:9)

据我所知,您需要做三件事:让所有人改变数据操作只能使用POST请求,不允许POST请求没有有效的referrer(它必须来自同一个域)并检查每个中的auth令牌POST请求(POST令牌值必须与cookie中的令牌相同)。

前两个将使得很难做出任何有害的CSRF请求,因为它们通常是电子邮件,其他网站等中的隐藏图像,并且使用有效的引用者进行跨域POST请求应该是不可能/现代难以做到的浏览器。如果没有窃取用户的cookie /嗅探他的流量,这样就完全不可能做任何有害行为。

现在关于你的问题:

  1. 这个问题让我很困惑:如果你正确使用auth令牌,那么攻击者必须知道来自cookie的用户令牌以及请求一起发送它,那么为什么启动一个有效的攻击者自己的会话可以造成任何伤害呢?
  2. Nonces会让你所有的链接变得丑陋 - 我再也见不到有人使用它们了。我认为您的网站可以使用它进行计量,因为您必须保存/搜索数据库中的所有nounces - 很多生成nounce的请求可能会非常快地增加您的数据库大小(并且搜索它们会很慢)。
  3. 如果每个user_id只允许一个nounce来阻止(2)Dos攻击,那么如果用户打开一个页面,然后打开另一个页面然后提交第一页 - 他的请求将被拒绝,因为新的nounce已生成并且旧的一个已经无效。
  4. 除了cookie,GET或POST变量之外,您还将如何识别没有会话ID的唯一用户?
  5. UPD:由于我们不再讨论CSRF了:你可能会实施许多模糊的防御措施,以防止蜘蛛机器人提交你的表格:

    1. 不应填写的隐藏表单字段(机器人通常会填充他们看到的具有良好名称的大多数表单字段,即使它们真的是为用户隐藏的)
    2. Javascript鼠标跟踪器(您可以分析记录的鼠标移动以检测机器人)
    3. 文件请求日志分析(加载页面时javascript / css / images在大多数情况下也应加载,但有些(非常罕见)用户关闭它)
    4. Javascript表单更改(当隐藏(或不)字段添加到服务器端需要的javascript表单时:机器人通常不执行javascript)
    5. 流量分析工具,如Snort,用于检测Bot模式(奇怪的用户代理,过快的表单提交等)。
    6. 以及更多,但在一天结束时,一些现代机器人使用真实用户行为的总体模拟(使用真正的浏览器API调用) - 所以如果任何人真的想要攻击你的网站,没有防御这样会对你有所帮助。即使CAPTCHA今天也不是很可靠 - 除了复杂的图像识别算法,你现在可以购买1000个CAPTCHA,由人类为任何网站解决,价格低至1美元(你可以在发展中国家找到这样的服务)。所以真的,没有100%防御机器人 - 每种情况都不同:有时你必须自己创建复杂的防御系统,有时只需要一点点调整就会有所帮助。