1

我正在学习如何使用反 CSRF 令牌来防止 CSRF。本质上,这个想法是:-

1) 生成一个令牌,例如 Md5 或 Sha1,然后将此值存储在会话变量中:-

$token = md5(uniqid(rand(), TRUE));
$_SESSION['token'] = $token;

2) 所有表单都在 POST 隐藏字段中包含此令牌值

<input type='hidden' name='token' value='$nonce_token' />

例如,在源代码中用户会是什么样子:-

<input type='hidden' name='token' value='9ee66e4e63a06ee4b83a3edde4ecd587' />

3)一旦发送表单,检查 POST 隐藏字段令牌值是否与存储在会话值中的令牌匹配

if($_POST['token']==$_SESSION['token']){...ok...}

然而,这个过程似乎有点缺陷,因为通过在隐藏的 POST 字段中包含令牌值,攻击可以简单地查看网站源代码以查看令牌,然后将其包含在我的应用程序将因此而生成的恶意 POST 表单中一旦收到作为发送的令牌值成功将匹配我的会话变量中的令牌值,因为我基本上向攻击者显示我的隐藏字段中的令牌值。

因此,我的问题是最好的解决方法是什么,因为我的一些想法似乎仍然没有什么缺陷:-

1) 改用 _GET 但这仍然有 _POST 之类的缺陷

2) 在 x 分钟或每个请求后更改令牌值,但在返回浏览器时会导致可用性问题或在用户填写表单时失败,并且令牌值与更新的会话令牌值相比会变得过时,因为隐藏令牌值不会在用户更新时更新填写表格。

3)尝试加密隐藏的 POST 表单令牌值,然后在发送 POST 时解密,但加密/解密已经散列的值似乎很复杂,尤其是一种加密方式具有 MD5 等值?

任何想法将不胜感激。

4

4 回答 4

3

您需要做的是使隐藏字段成为带有盐的会话 ID 的 MD5 或 SHA1 哈希。这样,您将提交的值与会话 ID 的哈希值加盐进行比较,如果它们匹配,则它是有效的。如果攻击者可以猜到令牌,那么他们已经窃取了会话 ID,并且由于登录已被劫持,因此再进行保护将毫无意义。真的就这么简单。这是每个 OWASP 关于如何防止 CSRF 的一些重要信息https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet

于 2012-11-11T10:51:50.270 回答
2

然而,这个过程似乎有点缺陷,因为通过在隐藏的 POST 字段中包含令牌值,攻击可以简单地查看网站源代码

不,他们不能。

爱丽丝经营一个网站。Bob 访问该网站。Mallory 正在攻击 Bob 的帐户。

Bob 在访问 Alice 的网站时会获得一个 nonce 令牌。

如果 Mallory 访问该站点,Mallory 将获得不同的nonce(因为 Mallory 将有不同的会话)。

如果 Mallory 生成了一个包含恶意数据的表单(在她的网站上)并欺骗 Bob 提交它,那么 Mallory 放入表单的 nonce 将与 Bob 会话中的 nonce 不匹配,并且提交将被拒绝。

于 2012-11-11T10:50:02.087 回答
2

让我们回顾一下攻击场景:

  1. 您有一个服务器,example.com并且您在表单中使用 CSRF 令牌。
  2. 每个 CSRF 令牌都是唯一的,特定于用户并且仅在一段时间内有效。
  3. 恶意第三方 Eve 诱骗您的用户 Alice 访问她的站点,试图发起 CSRF 攻击。
  4. 如果 Eve 只是欺骗 Alice 向你的服务器提交一个没有 CSRF 令牌的表单,你的服务器将拒绝它。
  5. 如果 Eve 在您的服务器上也有一个帐户并尝试获取任何令牌以与表单一起提交,这将失败,因为该令牌对 Alice 无效。

这留下了这种情况:使用 Javascript,Eve 从您的服务器获取一个表单作为 Alice,然后将该表单提交回来,包括一个有效的令牌。Ie Eve 完全模仿 Alice 使用 Javascript 进行常规表单提交的整个过程。Same Origin Policy可以防止这种情况发生。Eve 的 Javascript 将无法从您的服务器获取信息,Alice 的浏览器会阻止这种情况,因为它违反了同源策略。

也就是说,假设浏览器中没有允许 Eve 绕过该策略的安全漏洞。这也意味着您需要防范 XSS,即防止 Eve 能够将她的脚本之一注入您的网站,因此您网站的常规访问者会将 Eve 的脚本作为您网站的一部分从同一来源运行。


作为自我推销,我刚刚实现了一个基于签名的 CSRF 令牌库,您可能想看看:Kunststube\CSRFP。我还想征求同行评审和批评,而我正在这样做。

于 2012-11-11T11:37:49.663 回答
1

首先,您必须记住,您无法阻止黑客攻击您的应用程序,只有您可以让事情变得更加困难。

当您考虑 CSRF 攻击的主要目标是什么时,这个想法就很清楚了,CSRF 是一种攻击,它诱使受害者加载包含恶意请求的页面。从某种意义上说,它是恶意的,它继承了受害者的身份和特权以代表受害者执行不希望的功能,例如更改受害者的电子邮件地址、家庭住址或密码,或购买东西。CSRF 攻击通常针对导致服务器状态更改的函数,但也可用于访问敏感数据。

因此,如上所述,攻击者不会直接攻击您的网页,他们需要桥接,就是他们需要受害者,因此他们可以使用受害者身份和权限来执行操作。

当你说:

然而,这个过程似乎有点缺陷,因为通过在隐藏的 POST 字段中包含令牌值,攻击可以简单地查看网站源代码

这是没有意义的,因为攻击者不会攻击自己。

我希望这对您有帮助。

于 2012-11-11T11:01:25.613 回答