-1

防止 CSRF 的方法之一是在表单中使用令牌。在浏览了很多文章之后,我发现这些步骤通常是这样的:

  1. 生成一个加密的令牌值,将其存储在会话中,将令牌值设置在表单的隐藏字段中。
  2. 在表单处理页面中,比较隐藏字段中的令牌值和会话值是否相等,如下所示: $_POST['token'] == $_SESSION['token']

我的问题是我为什么要加密令牌值?假设我正在使用 GET 方法并且攻击者知道我将使用一个介于 1 到 1000 之间的简单整数值。如果攻击者要使用图像来伪造请求,那么他将不得不发送 1000 个图像蛮力请求..对吗?还是有其他方法可以做到这一点?

我还读到单独使用 POST 方法不足以阻止 CSRF 请求。所以我的第二个问题是,如果这是真的,如果我使用 POST 方法,攻击者如何成功创建伪造请求?

4

1 回答 1

0

对于使用许多自动化流程和应用程序执行 1000 个暴力请求的攻击者来说,这只是几分钟的问题。

因此最好像这样设置令牌:

$token = md5(uniqid(rand(), true));

这样一来,您总是会得到唯一的随机令牌,而根本不需要加密-它只会增加更多的混淆:-)。使用您首选的加密方法,有些人仅在sha1()这些天使用,有些人走得更远。但这不是五角大楼的安全区,只是一个容易猜到的随机令牌进行暴力攻击。

使用 POST 方法确实是不够的——我在 Firefox 中安装了一个扩展,它可以获取带有 GET 参数的 URL 并将其转换为 POST 请求。像复制+粘贴+点击一样简单。

此外,您不需要将令牌设置为隐藏字段,您还可以将其用作表单操作 URL 的 GET 参数,同时从 GET 读取令牌并从 POST 数组中读取表单数据......

于 2013-01-16T15:37:34.827 回答