CSRF保护和可用性

时间:2012-08-24 13:29:42

标签: php security usability csrf csrf-protection

在最强大的CSRF保护之间,有表单令牌保护。我对这个方法的问题是关于可用性:如果用户打开包含表单的多个页面,使用该令牌,则生成多个令牌,但只有最后打开的页面才能成功发送表单,所有其他都会给出错误

我想到了2个解决方案:

  1. 在整个会话期间保留一个唯一的令牌。
  2. 将所有生成的令牌存储在会话中。
  3. 可是:

    1. 这是更现实的解决方案,但不太安全。
    2. 这会产生很大的资源开销,因为用户可以打开很多页面,我必须存储所有生成的令牌。
    3. 因此,您是如何解决这个问题的?

      PS我正在开发的网站实际上是PHP中的电子商务,虽然汇款将通过外部提供商(如paypal)进行管理,但我认为这样可以为我的服务提供良好的安全保障。

1 个答案:

答案 0 :(得分:2)

您无需在数据库中存储令牌。

相反,您应该在Cookie中包含相同的标记;跨站点攻击者无法读取或设置cookie 只要您在Cookie中获得与POST表单相同的令牌,就可以了。

为了提高安全性,您可以使用键控HMAC哈希对其进行哈希处理,并验证哈希值以确保令牌来自您的服务器。
您还可以为每个用户制作令牌。