CSRF保护和可用性


CSRF protection and usability

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

我想了两个解决方案:

  1. 在整个会话期间保持唯一的令牌
  2. 将所有生成的令牌存储在会话中

但是:

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

因此,你是如何解决这个问题的?

PS我正在开发的网站,实际上是一个PHP电子商务,虽然汇款将通过外部提供商(如贝宝)进行管理,但我认为这对我的服务来说是一个很好的安全保障。

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

相反,您应该在cookie中包含相同的令牌;跨站点攻击者无法读取或设置cookie
只要你在cookie中得到与张贴表单相同的令牌,你就安全了。

为了获得额外的安全性,您可以使用带密钥的HMAC哈希对其进行哈希,并验证该哈希以确保令牌来自您的服务器
您还可以为每个用户制作令牌。