注销后的 CSRF 令牌生命周期

Posted

技术标签:

【中文标题】注销后的 CSRF 令牌生命周期【英文标题】:CSRF Token lifecycle after Logout 【发布时间】:2016-02-03 19:47:11 【问题描述】:

在玩Spring security 时,我想知道CSRF(跨站点请求伪造)令牌生命周期在应用程序注销时的方法。

假设用户登录并在我的网站上导航。然后他退出。我是否应该使 CSRF 令牌无效(在我的情况下作为 cookie 实现,如果重要的话)?

如果没有,在安全方面我应该注意什么?

如果是,我应该如何管理用户在应用程序上的任何进一步操作?没有任何CSRF Token,服务器端会禁止一些动作。那我应该生成一个新的Token吗?

我在服务器端使用Spring boot,默认情况下它似乎使令牌无效(或者我做错了什么导致这个结果......)

感谢您的帮助。

【问题讨论】:

你的意思是你有一个根据“双重提交Cookie”模式的自定义实现? 我不知道这种模式,所以不知道。但我会在 OWASP 备忘单中阅读它以了解我的文化 【参考方案1】:

我假设你说的是Double Submit Cookies CSRF prevention method。

如果不是,那么这不是一个安全的解决方案 - 有关保护 CSRF 的一些方法,请参阅Why is it common to put CSRF prevention tokens in cookies?

是的,您应该在注销和登录时刷新 CSRF 令牌。请注意,并非每个站点都需要防止登录 CSRF。 See this answer 如果您需要这样做。

登录时不刷新 CSRF 令牌的(非常低的)风险是,如果另一个用户使用同一个浏览器登录,则原始用户知道 CSRF 令牌,如果他们诱使新用户跟踪恶意链接。当然,如果第一个用户可以控制浏览器或操作系统,他们可以简单地在机器本身上安装一些东西来做到这一点。但是,如果第二个用户在使用前彻底检查了机器,那么这种类型的 CSRF 攻击将无法检测到(尽管如果用户非常警惕,那么他们在登录时不会去点击任何收到的链接)。

简而言之,如果您正在实施 CSRF 保护,那么您最好正确执行此操作并在登录和注销时刷新令牌。

【讨论】:

这回答了我的问题。我现在将在注销后实现 CSRF 重新生成。感谢您的提示。【参考方案2】:

登录

为了防止伪造登录请求,登录表单也应该被保护免受 CSRF 攻击。由于 CsrfToken 存储在 HttpSession 中,这意味着将立即创建一个 HttpSession。虽然这在 RESTful / 无状态架构中听起来很糟糕,但现实是状态对于实现实际安全性是必要的。如果没有状态,如果令牌被泄露,我们将无能为力。实际上,CSRF 令牌的大小非常小,对我们的架构的影响应该可以忽略不计。

退出

添加 CSRF 将更新 LogoutFilter 以仅使用 HTTP POST。这可确保注销需要 CSRF 令牌,并且恶意用户无法强制注销您的用户。

一种方法是使用表单注销。如果你真的想要一个链接,你可以使用 javascript 让链接执行 POST(即可能在隐藏表单上)。对于禁用了 JavaScript 的浏览器,您可以选择让该链接将用户带到将执行 POST 的注销确认页面。

查看此链接了解更多信息:Csrf protection 你也可以看csrf timeout

【讨论】:

谢谢@Amit。我从 Spring 安全文档中看到了这个摘录。但这并不能真正回答我的问题:注销后令牌会发生什么?我想服务器应该生成一个新的(这是合乎逻辑的,因为会话已被清除)。我只是想确保这是正确的方法,并且没有我没有看到的警告。

以上是关于注销后的 CSRF 令牌生命周期的主要内容,如果未能解决你的问题,请参考以下文章

注销活动生命周期回调的正确方法是啥?

如何在 Keycloak 中指定刷新令牌的生命周期

Laravel 5 - 用户在会话生命周期后不注销

具有自定义生命周期的身份服务器 4 访问令牌

Laravel Passport 令牌生命周期

IdentityServer4 访问令牌生命周期