为啥我收到无效的 csrf 令牌?

Posted

技术标签:

【中文标题】为啥我收到无效的 csrf 令牌?【英文标题】:Why I recieve invalid csrf token?为什么我收到无效的 csrf 令牌? 【发布时间】:2019-08-13 16:34:08 【问题描述】:

我有一个带有 spring-cloud-security 的项目。它是用于 oauth 授权的 auth 服务器。过去效果很好。

我通过配置添加了用于 ssl 支持的弹簧配置文件:

security:
  require-ssl: true
server:
  ssl:
    key-store: dev.p12
    key-store-password: devpass
    keyStoreType: PKCS12
    keyAlias: calc

使用此配置文件,身份验证工作正常,但当我禁用它并通过 http 登录时,身份验证失败。

o.s.security.web.csrf.CsrfFilter         : Invalid CSRF token found for http://localhost:8090/login

我该如何解决?

【问题讨论】:

【参考方案1】:

您的服务器启用了CSRF。 @EnableWebSecurity 注解将默认启用 CSRF,如 documentation 中所述。

Java 配置默认启用 CSRF 保护。

有两种方法可以“修复”此问题,在执行 PATCHPOSTPUTDELETE 操作时禁用 CSRF 或 submit the CSRF-token。

要禁用 CSRF,请在 Spring Security 配置中进行

@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter 

  @Override
  protected void configure(HttpSecurity http) throws Exception 
    http.csrf().disable();
  

要提交 CSRF 令牌,您必须将其包含在对服务器的请求中(在本例中是发送 POST 请求的 JSP)

<c:url var="logoutUrl" value="/logout"/>
<form action="$logoutUrl" method="post">
  <input type="submit" value="Log out" />
  <input type="hidden" name="$_csrf.parameterName"
    value="$_csrf.token"/>
</form>

所有示例均取自 Spring Cross Site Request Forgery (CSRF) documentation

考虑是否禁用CSRF请参考Spring的建议

[...] 对任何可以由 普通用户浏览器。如果您只是创建一个服务 由非浏览器客户端使用,您可能希望禁用 CSRF 保护。

【讨论】:

Csrf 在 ssl 之前运行良好。在此之后,当我将它与 http 协议一起使用时,我遇到了错误。也许在浏览器中兑现了一些东西?

以上是关于为啥我收到无效的 csrf 令牌?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我会收到“CSRF 令牌丢失或不正确”错误?

node.js csurf 无效的 csrf 令牌

CSRF 令牌无效。请尝试重新提交表单

Symfony:身份验证请求失败:无效的 CSRF 令牌

HTTP 状态 403 - 在请求参数“_csrf”或标头“X-CSRF-TOKEN”上发现无效的 CSRF 令牌“null”

Jmeter 身份验证令牌