防止跨站点请求伪造

时间:2013-01-16 15:24:00

标签: php post

防止CSRF的一种方法是在表单中使用令牌。经过大量文章后我发现步骤通常都是这样的:

  1. 生成加密的令牌值,将其存储在会话中,将令牌值设置在表单的隐藏字段中。
  2. 在表单处理页面中比较隐藏字段中的标记值和相等的会话值,如下所示:$ _POST ['token'] == $ _SESSION ['token']
  3. 我的问题是我为什么要加密令牌值?假设我正在使用GET方法并且攻击者知道我将使用一个简单的整数值,让我们说1到1000。 如果攻击者打算使用图像来伪造请求,那么他将不得不发送1000张图片来强制请求。或者还有其他方法吗?

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

1 个答案:

答案 0 :(得分:0)

对于使用许多自动化流程和应用程序执行1000次暴力请求的攻击者只需几分钟的时间。

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

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

通过这种方式你总是最终得到唯一随机令牌,而根本不需要加密 - 它只是增加了更多的混淆:-)。使用您的优先加密方法,有些人现在只使用sha1(),有些人会更进一步。但这不是五角大楼的安全区,只有随机令牌 不应该很容易猜到做蛮力攻击。

使用POST方法确实不够 - 我已经为我的Firefox安装了一个扩展程序,它可以获取带有GET参数的URL并将其转换为POST请求。轻松复制+粘贴+点击。

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