在请求参数“_csrf”或头部“X-CSRF-TOKEN”上find无效的CSRF令牌'null'
configurationSpring Security 3.2后, _csrf.token
不绑定到请求或会话对象。
这是弹簧安全configuration:
<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ñ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'.
更新经过一些debugging后,请求对象从DelegateFilterProxy中取出,但在CoyoteAdapter的第469行中,它执行request.recycle(); 删除所有属性…
我使用JDK 1.7在Tomcat 6.0.36,7.0.50中进行testing。
我还没有理解这种行为,而不是这样,如果有人指出我和Spring Security 3.2在一些应用程序的示例性战争的方向上,那么CSRF就是可行的。
看起来您的Spring应用程序中的CSRF(跨站点请求伪造)保护已启用。 其实它是默认启用的。
据spring.io介绍 :
什么时候应该使用CSRF保护? 我们的build议是对于普通用户可以通过浏览器处理的任何请求使用CSRF保护。 如果您只创build非浏览器客户端使用的服务,则可能需要禁用CSRF保护。
所以要禁用它:
@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令牌:
<form action="./upload?${_csrf.parameterName}=${_csrf.token}" method="post" enctype="multipart/form-data">
你不应该添加到login表单吗?
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
正如在这里的春季安全文档中所述
如果您将应用安全性=“无”,则不会生成csrf标记。 页面不会通过安全filter。 使用angular色ANONYMOUS。
我没有详细介绍,但是它为我工作。
<http auto-config="true" use-expressions="true"> <intercept-url pattern="/login.jsp" access="hasRole('ANONYMOUS')" /> <!-- you configuration --> </http>
尝试改变: <csrf />
为: <csrf disabled="true"/>
。 它应该禁用csfr。
我曾经有同样的问题。
你的configuration使用security =“none”,所以不能生成_csrf:
<http pattern="/login.jsp" security="none"/>
你可以设置访问=“IS_AUTHENTICATED_ANONYMOUSLY”页面/login.jspreplace上面的configuration:
<http> <intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY"/> <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>
加上百里香,你可以补充:
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
请在Github上查看我的工作示例应用程序,并与您的设置进行比较。
我认为csrf只适用于spring的forms
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
改变form:form
标签,看到它的作品。
Spring文档禁用csrf: https ://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html#csrf-configure
@EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable(); } }
在您的控制器中添加以下内容:
@RequestParam(value = "_csrf", required = false) String csrf
并在jsp页面上添加
<form:form modelAttribute="someName" action="someURI?${_csrf.parameterName}=${_csrf.token}