CSRF 令牌多选项卡问题


CSRF Token Multiple tab issue

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

我在每个成功的请求时更改令牌

是的,这就是为什么我们不会在每个成功的请求中使令牌无效。这不仅会破坏多标签浏览,还意味着您无法执行诸如点击后退按钮然后提交之类的操作。

"在每个请求上使令牌无效"是你从渗透测试报告中得到的那种虚假的安全建议,测试人员没有发现很多真正脆弱的东西。与往常一样,无论您是否这样做,这都是一种权衡,但可用性的缺点几乎总是超过最小的安全优势。

只需要在权限级别更改时使CSRF令牌(以及会话令牌)失效,尤其是在登录时。这可以防止在登录之前知道会话和 CSRF 令牌的攻击者在您登录后利用这些令牌,从而减轻会话固定攻击。

您可以轻松实现:

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

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

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

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

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

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

生成两个值 – 一个随机键(例如通过 uniqid)和一个随机令牌。

每次呈现表单时,您都会生成两者,并将它们放入隐藏字段中。然后使用随机密钥将令牌保存到会话中。然后,当收到表单数据时,您检查令牌发送是否在密钥发送下的会话中。(如果是这样,您可以在处理表单后使用此键删除条目。

其他任何东西(例如令牌的到期时间,令牌绑定到几种表单类型中的某种形式类型)您实现的与以前相同。

是这样不必要和不安全的,为什么你不创建一个基于 openssl_random_pseudo_bytes() 的会话的令牌,这将产生一个安全的令牌,并检查是否正确,或者你也可以使用 2-5 分钟后过期.你也可以在 OWASP 上检查关于 DOM 上的代币,可以很容易地!!