这对CSRF保护是否足够?

时间:2011-01-30 01:48:21

标签: php csrf

这对CSRF保护是否足够:

  • 生成随机字符串,$_SESSION['hash']存储
  • 表单中的隐藏值(在$_POST['thing']中)包含随机字符串
  • 提交表单时,会检查$_SESSION['hash']是否等于$_POST['thing'],如果匹配则继续

我网站的一位用户一直告诉我,我的网站容易受到攻击,但我不知道他是否只是在拖我。还有什么我可以做的吗?

4 个答案:

答案 0 :(得分:3)

我认为您缺少的是将令牌限制在较短的时间窗口内。

你应该看看Chris's CRSF-article。快速摘要:

  • CSRF攻击必须包含有效令牌(反CSRF令牌)才能完美模仿表单提交。
  • 令牌的有效性也可以限制在一个小的时间窗口,例如五分钟
  • 如果您按照我的建议在所有表单中使用令牌,则可以从关注列表中删除CSRF。虽然没有任何保护可以被认为是绝对的(攻击者理论上可以猜测有效令牌),但这种方法可以减轻大部分风险。直到下个月,保持安全。

答案 1 :(得分:1)

如果它对每个用户都是唯一的,那么它就足够了。即使用户会话持续时间相同,它仍然可以,但我建议定期重新生成它。 此外,您可能希望每个表单使用不同的标记。例如,如果您有登录表单和注释表单,最好为它们使用不同的令牌,但这不是100%必要的。

为什么你认为只是因为有人说你的网站容易受到攻击,这与CSRF附加有关?它们是许多其他可能的漏洞。

也许你的网络服务器已经过时且易受攻击,也许php版本不是最新版本。也许用户可以通过ssh或telnet登录到您的服务器。也许用户能够猜出管理员密码。

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

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

答案 2 :(得分:1)

  

每次加载页面时,如果尚未设置,则会更改。

那么你有问题。一旦检索到令牌,就可以进一步轻松地执行所有操作。我通常将令牌实现为对单个请求有效,然后重新生成它。

答案 3 :(得分:0)

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

  • 你可以额外减少cookie的生命时间
  • 检查HTTP Referer标头
  • 和验证码 - 但不是每个用户都喜欢它

然而你的秘密钥匙仍然比没有好......