gpt4 book ai didi

spring - CSRF token 在登录期间过期

转载 作者:IT老高 更新时间:2023-10-28 13:45:58 25 4
gpt4 key购买 nike

我正在开发 Spring Web 应用程序,我需要避免登录页面上过期 csrf token 的问题,因为如果用户等待太久并尝试登录,解决 csrf 问题的唯一方法是重新加载页面并尝试再次登录。但它对用户不友好,我想避免这种情况。

第一个问题:一般情况下是否可能(通过 spring security 3.2.4)?不禁用 csrf。

我尝试对登录页面使用 security="none"和 spring seciruty "login_check",但它不起作用,我得到无限重定向或者我收到错误,即没有映射 url "myhost/login_check"。

第二个问题:我该怎么做?

最佳答案

推荐解决方案

我会说您不应该在生产站点上禁用 csrf token 。您可以使 session (以及 csrf token )持续更长时间(但通常不应持续超过一天,尤其是对于未登录的用户,因为它是 DOS 向量),但真正的解决方案可能是自动刷新csrf token 过期时的登录页面。你可以使用一个

<META HTTP-EQUIV="REFRESH" CONTENT="csrf_timeout_in_seconds">

在您的登录页面标题中。如果用户让登录页面停留数小时,那么页面刷新应该不会打扰他。

第二种解决方案

一种不需要您实际存储 session 但允许无限超时的可能解决方案是,您可以使用 session ID 和服务器端 secret 的散列生成您的 csrf token :

csrf = hash(sessionid+secret)

但是请注意,您需要真正挖掘和覆盖 spring-security 内部机制,即:

  • 如果请求到达但不存在此类 session ,则即时重新创建匿名 session
  • 根据 session ID 即时重新创建 csrf token

并选择一个非常安全的哈希算法,最好是sha-512。

第三种解决方案

您可以有一个小的 javascript 定期调用服务器上的无操作页面(就在 session 超时之前),从而延长您的 session 。仅当浏览器一直处于打开状态时,才会导致无限 session 超时,因此缓解了 DOS 方面的问题。

好的,最后一个解决方案

您可以更改 CSRF token 检查代码,并在登录页面禁用它。这实际上是第二种解决方案的同义词,但特定于登录页面,通常不适用于所有匿名 session 。

您可以这样做,例如通过在 HttpSecurity 中设置自定义 RequestMatcher:

http.csrf().requireCsrfProtectionMatcher(new MyCsrfRequestMatcher());
...
class MyCsrfRequestMatcher implements RequestMatcher {
@Override
public boolean matches(HttpServletRequest request) {
return !request.getServletPath().equals("/login");
}
}

关于spring - CSRF token 在登录期间过期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27501212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com