Vraag Verwacht CSRF-token niet gevonden. Is uw sessie verlopen 403


Ik probeer mijn testveilige beveiligingsapplicatie te schrijven met mkyong-voorbeelden.

Spring Security: 4.0.0.RC1
Spring: 4.1.4.RELEASE

Ik heb de volgende beveiligingsconfiguratie:

<http auto-config="true">
    <intercept-url pattern="/admin**" 
                    access="hasRole('ADMIN')"/>
    <form-login authentication-failure-url="/?auth_error" 
                        username-parameter="user" 
                        password-parameter="password" 
                        login-page="/"
                        default-target-url="/?OK"/>
<!-- <csrf/> -->
</http>

<authentication-manager>
    <authentication-provider>
        <user-service>
            <user name="mkyong" password="123456" authorities="ADMIN" />
        </user-service>
    </authentication-provider>
</authentication-manager>

login pagina:

<html>
<body>
<form method="POST">
    <label for="user">User: </label>
    <input type="text" id="user" name="user" /> </br>
    <label for="password">Password: </label>
    <input type="text" name="password" id="password" /> </br>
    <input type="submit" /> 
</form>
</body>
</html>

Nu, wanneer ik probeer in te loggen, krijg ik de 403-foutpagina:

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

Beschrijving:

Access to the specified resource (Invalid CSRF Token 'null' was
found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.) has been 
forbidden.

Wat is er aan de hand, hoe kan ik dat oplossen? ik reageerde csrf in de config, maar het foutbericht heeft te maken met de csrf.


27
2018-01-25 16:49


oorsprong


antwoorden:


Ik had hetzelfde probleem. Ik gebruik Thymeleaf en Spring Boot en kreeg het CSRF-tokenprobleem als ik probeer gegevens in een formulier te plaatsen.

Dit is mijn werkende oplossing:

  1. Voeg deze verborgen invoer toe:

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

  2. In uw WebSecurityConfig (die zich uitstrekt WebSecurityConfigurerAdapter), voeg een methode toe:

    private CsrfTokenRepository csrfTokenRepository() 
    { 
        HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository(); 
        repository.setSessionAttributeName("_csrf");
        return repository; 
    }
    

    en voeg code toe in de methode configure():

    @Override
     protected void configure(HttpSecurity http) throws Exception {
         http.csrf()
         .csrfTokenRepository(csrfTokenRepository())
    

Ik heb veel tijd aan dit probleem besteed. Ik hoop dat het iemand kan helpen met hetzelfde probleem.


41
2017-08-12 00:52



Als je het moet uitschakelen ...

In Spring Security 4, CSRF is standaard ingeschakeld bij gebruik van de XML-configuratie. Voorheen was dit alleen standaard ingeschakeld voor de op Java gebaseerde configuratie.

Volgens Paragraaf 14.4.2 van de voorjaarsbeveiligingsdocumentatie:

Vanaf Spring Security 4.0 is CSRF-beveiliging standaard ingeschakeld met XML-configuratie. Als u CSRF-beveiliging wilt uitschakelen, ziet u de bijbehorende XML-configuratie hieronder.

<http>
   ...
   <csrf disabled="true"/>
   ...
</http>

24
2018-01-25 16:58



Het uitschakelen van CSRF-bescherming klinkt als een slecht idee, niet?

Als u de Form Tag-bibliotheek van Spring gebruikt, wordt het CSRF-token automatisch toegevoegd. Het zal ook HTML-elementwaarden voor Escape-formulieren zijn, waardoor uw site veiliger is tegen XSS en correcter.

<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> 

<form:form>
  <form:input...
</form:form>

Anders voeg je dit toe aan je formulier:

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

20
2018-02-20 21:02



Naar @ St.Antario,   Gebruik deze code om CSRF in uw code in te schakelen

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .antMatcher("*/*").authorizeRequests()
                .antMatchers("/", "/login**").permitAll()
                .anyRequest().authenticated()
                .and().csrf().csrfTokenRepository(csrfTokenRepository())
                .and().addFilterAfter(csrfHeaderFilter(), SessionManagementFilter.class);
    }

    private Filter csrfHeaderFilter() {
        return new OncePerRequestFilter() {

            @Override
            protected void doFilterInternal(HttpServletRequest request,
                                            HttpServletResponse response,
                                            FilterChain filterChain) throws ServletException, IOException {

                CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class.getName());
                if (csrf != null) {
                    Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN");
                    String token = csrf.getToken();
                    if (cookie == null || token != null
                            && !token.equals(cookie.getValue())) {

                        // Token is being added to the XSRF-TOKEN cookie.
                        cookie = new Cookie("XSRF-TOKEN", token);
                        cookie.setPath("/");
                        response.addCookie(cookie);
                    }
                }
                filterChain.doFilter(request, response);
            }
        };
    }

    private CsrfTokenRepository csrfTokenRepository() {
        HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
        repository.setHeaderName("X-XSRF-TOKEN");
        //repository.setSessionAttributeName(("X-XSRF-TOKEN"));
        return repository;
    }
}

4
2017-08-11 21:51



spring-security.xml

<beans:beans xmlns="http://www.springframework.org/schema/security"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:beans="http://www.springframework.org/schema/beans"
             xsi:schemaLocation="
    http://www.springframework.org/schema/security 
    http://www.springframework.org/schema/security/spring-security.xsd
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd">

    <http pattern="/resources/**" security="none" />

    <http use-expressions="true">
        <intercept-url pattern="/login*" access="isAnonymous()" />
        <intercept-url pattern="/**" access="isAuthenticated()"/>
        <form-login
            login-page="/login"
            default-target-url="/home"
            authentication-failure-url="/login?error=true" /> 
        <logout
            logout-success-url="/login"
            delete-cookies="JSESSIONID" />
    </http>
    <authentication-manager>
        <authentication-provider>
            <user-service>
                <user name="carlos" password="123" authorities="ROLE_USER" />
            </user-service>
        </authentication-provider>
    </authentication-manager>
</beans:beans>

web.xml 

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml, /WEB-INF/spring-security.xml</param-value>
</context-param>

voeg add jsp login toe 

<%@page session="true"%>

en invoer verborgen:

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

1
2018-06-23 02:16