这对于CSRF保护足够了吗?

问题描述:

这是足以让CSRF保护:这对于CSRF保护足够了吗?

  • 生成一个随机字符串,$_SESSION['hash']并将其存储
  • 隐藏值(以$_POST['thing'])的形式包含随机字符串
  • 当提交表单时,它会检查是否$_SESSION['hash']等于$_POST['thing'],并继续它们是否匹配

我的一个网站的用户不断告诉我,我的网站是脆弱的,但我不能告诉我们,如果他只是在拖我。还有什么我可以做的吗?

+0

它可能取决于你改变随机字符串的频率;每个用户都必须得到他们自己的,我建议定期轮换它,所以意外披露并不会造成太大的损害。 – sarnold 2011-01-30 02:05:06

+0

每次他们加载页面时,如果它尚未设置,它会改变。 – 2011-01-30 02:11:38

如果它'对每个用户来说都是独一无二的,那么它应该就够了。即使用户会话持续时间相同,它仍然可以,但我建议定期重新生成它。 另外你可能想要为每个表单使用不同的标记。例如,如果您有登录表单和注释表单,最好为它们使用不同的标记,但它不是100%必需的。

为什么你认为只是因为有人说你的网站很脆弱,它与CSRF的连接有关?他们有很多其他可能的漏洞。

也许你的网络服务器过时和脆弱,也许PHP版本不是最新的。也许用户能够通过ssh或telnet登录到你的服务器。也许用户能够猜出管理员密码。

也许让人们通过cookie登录并将登录凭据存储在cookie中。

除CSRF之外还有太多可以利用的东西。用户也有可能是错的,或者不知道他在说什么,或者他只是想让你紧张。

来自:http://en.wikipedia.org/wiki/Cross-site_request_forgery

  • 可以饼干
  • 检查HTTP引用头
  • 和验证码的生活更多的降低 - 但不是每个用户都喜欢它
但是你

与秘密钥匙acion仍然比没有好...

我认为你缺少的是将标记限制在小窗口时间。

你应该看看Chris's CRSF-article。快速总结:

  • CSRF攻击必须包括一个有效的令牌(反CSRF令牌),以便完美地模仿表单提交。
  • 令牌的有效性也可以限制在一小段时间内,如五分钟
  • 如果您按照我的建议在您的所有表单中使用了一个令牌,则可以从您的关注列表中消除CSRF 。虽然没有保障措施可以被认为是绝对的(攻击者理论上可以猜出有效的代币),但这种方法可以减轻大部分风险。直到下个月,安全。

每次他们加载页面时,它的变化,如果它不是已设置。

那么这是你的问题。一旦令牌被取回,所有的动作都可以被轻松地进一步执行。我通常将令牌实施为对一个请求有效,然后再生成它。