2012-08-24 69 views
-1

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

我想2个解决方案:

  1. 保持一个独特的令牌会话的所有时间。
  2. 在会话中存储所有生成的令牌。

但是:

  1. 这是比较现实的解决方案,但安全性较差。
  2. 这会产生很大的资源开销,因为用户可能会打开很多页面,并且我必须存储所有生成的令牌。

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

PS我正在开发的网站实际上是PHP中的电子商务,尽管汇款将通过外部提供商(如paypal)进行管理,但我认为正确的做法是为我的服务提供安全保障。

回答

2

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

相反,您应该在cookie中包含相同的标记;跨站点攻击者无法读取或设置cookie。
只要您在Cookie中获得与发布表单相同的标记,就很安全。

为了获得额外的安全性,您可以使用键控HMAC散列对它们进行散列,然后验证该散列以确保令牌来自您的服务器。
您也可以制作每个用户的令牌。

+0

谢谢SLaks的答案。令牌已存储在用户会话中(但我将会话数据存储在数据库中)。令牌是随机生成的字符串,因此实际上无法计算。因此,HMAC Hash的效用是什么? 保持一个唯一的每个用户令牌,比每个表单显示的令牌安全,您不觉得吗? “你也可以让每个用户的令牌”这个思想确立,否则安全性在哪里? – Eghes

+1

@Eghes:散列不会很好,但不会造成任何伤害。按用户来说,我的意思是在令牌中包含一个用户ID(散列以防止交换),这样即使攻击者可以读取或写入令牌,他仍然需要获取该ID。 (这可以更好地使用单独的ID或GUID,而不用于其他任何内容) – SLaks

+0

好的,谢谢。但是,最后,您是否建议为所有用户会话使用单个令牌? – Eghes