为啥我收到无效的 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 保护。
有两种方法可以“修复”此问题,在执行 PATCH
、POST
、PUT
和 DELETE
操作时禁用 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 令牌?的主要内容,如果未能解决你的问题,请参考以下文章
HTTP 状态 403 - 在请求参数“_csrf”或标头“X-CSRF-TOKEN”上发现无效的 CSRF 令牌“null”