CSRF令牌多选项卡问题

时间:2013-11-13 06:34:50

标签: php security post csrf csrf-protection

我正在每个帖子方法的网站上实现CSRF令牌。 但是当我在不同的标签中访问我的网页时,令牌会在两个页面和令牌不匹配上发生变化。 我的令牌存储在DOM中,我使用SESSION匹配令牌。 如何解决这个问题。?

5 个答案:

答案 0 :(得分:4)

  

我在每次成功的请求上更改令牌

是的,这就是为什么我们不会在每个成功的请求上使令牌无效。这不仅仅打破了多标签浏览,它还意味着你无法点击后退按钮然后提交。

“在每个请求上使令牌无效”是您从pentest报告中获得的虚假安全建议,其中测试人员没有发现真正易受攻击的内容。无论如何,这都是一种权衡取舍,但可用性下降几乎总是超过最小的安全性好处。

您只有真的需要在权限级别更改时使CSRF令牌(以及会话令牌)无效,最明显的是在登录时。这可以通过防止在登录之前知道会话和CSRF令牌的攻击者在您登录后利用这些令牌来缓解会话固定攻击。

答案 1 :(得分:1)

您可以轻松实现这一目标:

在服务器端,将CSRF令牌存储在会话中,如下所示:

$_SESSION['csrf_tokens']['form1'] = //code to generate csrf token

在表单提交上验证令牌时,您可以检查

$_SESSION['csrf_tokens']['form1'] === $_POST['csrf_token']

答案 2 :(得分:1)

请发布示例代码,除非您使用的是ajax(我不推荐使用CSRF令牌,如果您打开新选项卡,代码不应在两个选项卡中都更改)。另外,我不同意bobince,你正在做正确的事情来实现这个措施,因为一旦你有了逻辑,你可以轻松,轻松地在所有形式中使用它。实现此目的的最佳方法是让每个令牌在一定时间后过期。

bobince:CSRF tokes用于防止CSRF攻击而不是会话固定攻击,两者都不同,前者阻止脚本代表用户执行操作,而后者是恶意用户通过猜测冒充普通用户的攻击或窃取他们的会话ID。

答案 3 :(得分:0)

生成两个值 - 一个随机密钥(f.e. via uniqid)和一个随机令牌。

每次渲染表单时都会生成 - 并将它们都放入隐藏字段中。然后使用随机密钥将令牌保存到会话中。然后,当收到表单数据时,您检查令牌发送是否在密钥发送下的会话中。 (如果是这样,在处理完课程后,你会删除带有此键的条目。)

其他任何事情(例如,令牌的到期时间,将令牌绑定到某些形式类型中的几个),您实现的方式与之前相同。

答案 4 :(得分:-2)

是不必要且不安全的,为什么你不打算基于与openssl_random_pseudo_bytes()的会话创建一个令牌,这将产生一个安全令牌,并检查是否正确或你也可以使用也在2-5分钟后过期。你也可以查看关于dom上令牌的owasp,可以轻松解散!!!