gpt4 book ai didi

spring - 在请求参数 'null' 或 header '_csrf' 上发现无效的 CSRF token 'X-CSRF-TOKEN'

转载 作者:IT老高 更新时间:2023-10-28 13:01:24 38 4
gpt4 key购买 nike

配置Spring Security 3.2后,_csrf.token不再绑定(bind)请求或 session 对象。

这是 Spring Security 配置:

<http pattern="/login.jsp" security="none"/>

<http>
<intercept-url pattern="/**" access="ROLE_USER"/>
<form-login login-page="/login.jsp"
authentication-failure-url="/login.jsp?error=1"
default-target-url="/index.jsp"/>
<logout/>
<csrf />
</http>

<authentication-manager>
<authentication-provider>
<user-service>
<user name="test" password="test" authorities="ROLE_USER/>
</user-service>
</authentication-provider>
</authentication-manager>

login.jsp 文件

<form name="f" action="${contextPath}/j_spring_security_check" method="post" >
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
<button id="ingresarButton"
name="submit"
type="submit"
class="right"
style="margin-right: 10px;">Ingresar</button>
<span>
<label for="usuario">Usuario :</label>
<input type="text" name="j_username" id="u" class="" value=''/>
</span>
<span>
<label for="clave">Contrase&ntilde;a :</label>

<input type="password"
name="j_password"
id="p"
class=""
onfocus="vc_psfocus = 1;"
value="">
</span>
</form>

它会渲染下一个 html:

<input type="hidden" name="" value="" />

结果是 403 HTTP 状态:

Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.

更新经过一些调试,请求对象从 DelegatingFilterProxy 中得到了很好的结果,但是在 CoyoteAdapter 的第 469 行它执行了 request.recycle();删除所有属性...

我在 Tomcat 6.0.36、7.0.50 和 JDK 1.7 中进行测试。

我不理解这种行为,而不是,如果有人指出我与 Spring Security 3.2 与 CSRF 一起使用的一些应用程序示例 war 的方向,那将是可能的。

最佳答案

您的 Spring 应用程序中的 CSRF(跨站点请求伪造)保护似乎已启用。实际上它是默认启用的。

根据spring.io :

When should you use CSRF protection? Our recommendation is to use CSRF protection for any request that could be processed by a browser by normal users. If you are only creating a service that is used by non-browser clients, you will likely want to disable CSRF protection.

所以要禁用它:

@Configuration
public class RestSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
}
}

如果您想保持启用 CSRF 保护,那么您必须在表单中包含 csrftoken。你可以这样做:

<form .... >
....other fields here....
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
</form>

您甚至可以在表单的操作中包含 CSRF token :

<form action="./upload?${_csrf.parameterName}=${_csrf.token}" method="post" enctype="multipart/form-data">

关于spring - 在请求参数 'null' 或 header '_csrf' 上发现无效的 CSRF token 'X-CSRF-TOKEN',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21128058/

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