使用会话令牌实现 CSRF 保护

Posted

技术标签:

【中文标题】使用会话令牌实现 CSRF 保护【英文标题】:Implementing CSRF protection using a session token 【发布时间】:2014-01-23 12:29:19 【问题描述】:

我试图在我的新项目中实施 CSRF 保护。我使用为每个表单创建会话令牌来执行相同的操作,并且该令牌存储在表单的隐藏字段中。每次提交表单时,我都会检查 POST 中的令牌和会话中的令牌是否相同。如果它们相同,则完成所需的操作并更新会话令牌。

它工作得很好,但是当我们刷新提交的页面时会出现实际问题。然后发生令牌不匹配。

我的问题是,为每个表单使用单个令牌并且不为每个表单提交更新令牌是否安全?这能防止 CSRF 吗?

【问题讨论】:

【参考方案1】:

是的,不需要更新 CSRF 令牌。它只需要在每个用户会话中都是唯一的。

由于攻击者无法读取隐藏表单字段的值,因此可以在会话期间重复使用相同的值。更新此值不会带来额外的安全性。

但是,它绝对应该是每个用户会话的唯一值。不同的用户应该有不同的令牌,如果同一个用户再次登录,最好让之前的令牌过期。

【讨论】:

以上是关于使用会话令牌实现 CSRF 保护的主要内容,如果未能解决你的问题,请参考以下文章

公开会话的 CSRF 保护令牌是不是安全?

使用会话令牌或随机数进行跨站点请求伪造保护 (CSRF)?

Spring CSRF 令牌生命周期

一个令牌与多个令牌以防止 CSRF 攻击

何时需要使用令牌保护表单(CSRF 攻击)?

对 CSRF 保护策略感到困惑