10

我有一个网络表单,我正在使用 PHP。我知道表单可以被操纵(我相信它被称为重放攻击或中间人攻击)。所以我想使用一些真实性令牌作为隐藏字段。

我知道的威胁可能性是:

  • 攻击者劫持了合法用户的表单(我认为这是中间人攻击)
  • 合法用户本身就是攻击者:他获取表单,读取令牌但使用它发送危险数据(我相信这是重放攻击)

在我回答问题之前,如果我到目前为止所说的任何内容不正确,请纠正我,因为也许我的理解有缺陷。

现在的问题:

  • 生成此令牌的最佳做法是什么,以便没有它的表单被拒绝(例如,加盐?)。
  • 人们做了什么来确保令牌不会被重放。

基于评论的新小问题:

  • 会话劫持与中间人攻击相同吗?
4

4 回答 4

5

您在标题中提到了 CSRF,但在您的问题中并没有真正涵盖它。

你可以在网上详细阅读它,但 CSRF 基本上是一种攻击,它让合法用户在不知不觉中提交到网站。例如,如果 SO 不能防止此类攻击,我可以制作一个表单,当您单击我的这种不良表单时,会导致您的 SO 个人资料信息发生更改,并期待其他事情发生(“赢一百万美元!点击这里!!”)。此表单将使用您的浏览器 cookie 来通过 SO 对您进行身份验证,并使 SO 看起来您正在合法地提交对您的个人资料的更新。

为了防止这种情况,你真的想做几件事:

  • 确保 GET 不会导致更新(例如,不要使用 GET 上的查询参数向用户的配置文件发布新的状态更新)
  • 确保所有 POST 都附有一个隐藏字段,让您可以验证表单是由您的服务生成的,而不是由其他人生成的,并且它是针对预期用户的。所以这个隐藏字段必须由服务器每次发送表单的 html 时生成,并且对于该会话的该用户来说应该是唯一的。

第二项的替代方法是检查引用者是否始终是您的站点或您期望 POST 来自的站点。对于非 HTTPS 站点,我不鼓励这样做,因为某些浏览器/网络硬件会删除引荐来源网址,并且引荐来源网址的存在并不总是可靠的。

于 2009-10-09T17:53:57.590 回答
3

用于生成令牌的方法不是很重要。 重要的是令牌只能使用一次。 在用户会话中保留为用户生成的令牌列表。如果用户提交表单并且提交的令牌不在会话中,您可以拒绝该表单。

防范中间人有点困难。我见过的一种常见技术是在哈希函数中包含所有隐藏的表单字段来生成令牌,然后根据已知的隐藏字段重新生成令牌。但是,这只能防止隐藏场操纵,这可能不是中间人的最终目标。

当用户使用令牌成功提交表单时,从会话中删除令牌,因此该提交的任何重放都将失败。但是,只需用户再次请求表单以生成另一个令牌。然后可以在随后的自动攻击中使用该新令牌。 换句话说,表单令牌对 CSRF 很有用,但对自动重放和中间人攻击不是很有效。

同样,您将希望调整您的应用程序,使其不需要在表单上使用用户的后退按钮。如果他们的提交有问题,您需要将表单返回给用户并填写他们的数据。如果用户点击她的后退按钮来纠正错误,她的提交将由于现在无效而失败令牌。

此外,坦率地说,当您需要担心请求重放和中间人攻击时,您的用户连接已经受到损害,您可能无法采取任何措施来减轻任何损害。单独的 SSL 是针对 MITM 和重放的足够保护级别,如果您担心它,您将在 SSL 下运行......

于 2009-10-09T17:41:38.953 回答
1

为了生成该令牌,这是我使用的一种似乎效果很好的策略。

  • 将 cookie 设置为随机值(使用常用技巧在服务器上生成)并根据您的需要将其设置为过期。
  • 使用表单提供页面时,嵌入一个隐藏字段,其值等于此 cookie 的值。
  • 处理帖子时,验证该字段是否存在,并且该值与用户的 cookie 匹配
于 2009-10-09T21:22:25.047 回答
0

csrf-magic 是一个很棒的 CSRF 令牌类,它会自动将它们放入您的页面

http://csrf.htmlpurifier.org/

“csrf-magic 使用 PHP 的输出缓冲功能来动态重写文档中的表单和脚本。它还会拦截 POST 请求并检查它们的令牌(使用了各种算法;有些生成随机数,有些生成用户特定的令牌)。这意味着,对于带有表单的传统网站,您可以将 csrf-magic 放入您的应用程序中,然后忘记它!”

于 2014-06-17T04:53:37.467 回答