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

153,432

Solution 1

It looks like the CSRF (Cross Site Request Forgery) protection in your Spring application is enabled. Actually it is enabled by default.

According to 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.

So to disable it:

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

If you want though to keep CSRF protection enabled then you have to include in your form the csrftoken. You can do it like this:

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

You can even include the CSRF token in the form's action:

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

Solution 2

Shouldn't you add to the login form?;

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

As stated in the here in the Spring security documentation

Solution 3

If you will apply security="none" then no csrf token will be generated. The page will not pass through security filter. Use role ANONYMOUS.

I have not gone in details, but it is working for me.

 <http auto-config="true" use-expressions="true">
   <intercept-url pattern="/login.jsp" access="hasRole('ANONYMOUS')" />
   <!-- you configuration -->
   </http>

Solution 4

With thymeleaf you may add:

<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>

Solution 5

Try to change this: <csrf /> to this : <csrf disabled="true"/>. It should disable csfr.

Share:
153,432
Hugo Robayo
Author by

Hugo Robayo

Updated on July 25, 2022

Comments

  • Hugo Robayo
    Hugo Robayo almost 2 years

    After configuring Spring Security 3.2, _csrf.token is not bound to a request or a session object.

    This is the spring security config:

    <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>
    

    The login.jsp file

    <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>
    

    And it renders the next html:

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

    The result is 403 HTTP status:

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

    UPDATE After some debug, the request object gets out fine form DelegatingFilterProxy, but in the line 469 of CoyoteAdapter it executes request.recycle(); that erases all the attributes...

    I test in Tomcat 6.0.36, 7.0.50 with JDK 1.7.

    I have not understood this behavior, rather than, it would be possible if someone point me in the direction of some application sample war with Spring Security 3.2 that works with CSRF.