如何在不牺牲可用性或安全性的情况下为每个请求生成新的 CSRF 令牌?



本文建议我们应该在每个请求上更改我们的CSRF令牌,以防止BREACH 攻击。 即,如果我们使用 gzip/brotli 和每会话 CSRF 令牌以及 SSL,我们的令牌容易受到攻击,只有 1000 个请求。

假设这是真的,如何在不破坏后退/前进和多个选项卡的情况下在每个请求上重新生成 CSRF 令牌?

显而易见的解决方案是在我们的会话中存储一组有效的 CSRF 代币,而不仅仅是最近的一个,也许将其限制为 100 个左右。

但是,如果我们使用 JWT 或其他东西呢?我们可以只将用户 ID 存储在那里,然后验证令牌是否未过期并且它属于当前用户,我们根本不需要将其存储在服务器上。唯一的问题是,当用户注销时,我们无法撤销 CSRF-JWT,这需要短暂的到期时间,但我们不希望它太短,否则它会在用户有机会提交表单之前过期。

解决此问题的最佳方法是什么?

您可以使用 JWT 并将其作为标头中的持有者令牌发送,并将其存储在本地存储中。不要将其发送到饼干中。在每个请求上发送它,并在每个请求上检查它的有效性。您可以为用户提供刷新令牌,您可以在用户注销时撤消该令牌。刷新令牌将生成访问 JWT,这些 JWT 在每次调用的极短时间后过期。

您可以使用 JWT 进行访问控制和所有授权需求。

最新更新