10

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

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

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

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

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

4

1 回答 1

9

据我了解,您需要做三件事:使所有更改数据操作仅适用于 POST 请求,禁止没有有效推荐人的 POST 请求(它必须来自同一域)并检查每个 POST 请求中的身份验证令牌( POST 令牌值必须与 cookie 中的令牌相同)。

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

现在关于您的问题:

  1. 这个问题真的让我很困惑:如果您正确使用身份验证令牌,那么攻击者必须从 cookie 中知道用户的令牌才能将其与请求一起发送,那么为什么启动一个有效的攻击者自己的会话会造成任何伤害?
  2. Nonce 会让你的所有链接变得丑陋——我再也没有见过有人使用它们了。而且我认为您的网站可以使用它,因为您必须保存/搜索数据库中的所有声明 - 生成声明的大量请求可能会非常快地增加您的数据库大小(并且搜索它们会很慢)。
  3. 如果您只允许每个 user_id 一个 nounce 以防止 (2) Dos 攻击,那么如果用户打开一个页面,然后打开另一个页面然后提交第一页 - 他的请求将被拒绝,因为生成了新的 nounce 并且旧的已经是无效的。
  4. 您将如何识别没有会话 ID 的唯一用户,无论是 cookie、GET 还是 POST 变量?

UPD:因为我们不再谈论 CSRF:您可能会实施许多模糊的防御措施,以防止蜘蛛机器人提交您的表单:

  1. 不应该填写的隐藏表单字段(机器人通常会填写他们看到的大部分具有好名称的表单字段,即使它们对用户来说确实是隐藏的)
  2. Javascript 鼠标跟踪器(您可以分析记录的鼠标移动以检测机器人)
  3. 文件请求日志分析(在大多数情况下,页面加载时 javascript/css/images 也应该加载,但一些(非常罕见的)用户将其关闭)
  4. Javascript 表单更改(当使用服务器端所需的 javascript 将隐藏(或不)字段添加到表单时:机器人通常不执行 javascript)
  5. 流量分析工具,如 Snort,用于检测 Bot 模式(奇怪的用户代理、太快的表单提交等)。

等等,但归根结底,一些现代机器人使用真实用户行为的完全模拟(使用真实的浏览器 API 调用) - 所以如果有人真的想攻击你的网站,那么没有这样的防御可以帮助你。即使是今天的 CAPTCHA 也不是很可靠 - 除了复杂的图像识别算法之外,您现在可以以低至 1 美元的价格为任何网站购买 1000 个由人工解决的 CAPTCHA(您可以在发展中国家找到这样的服务)。所以说真的,没有 100% 防御机器人 - 每种情况都不同:有时您必须自己创建复杂的防御系统,有时只需稍加调整就会有所帮助。

于 2011-08-03T15:47:13.113 回答