2015-01-25 4 views
27

Ich versuche, meine Testfeder Sicherheitsanwendung mit Mkyong Beispiele zu schreiben.Das erwartete CSRF-Token wurde nicht gefunden. Ist Ihre Sitzung abgelaufen 403

Spring Security: 4.0.0.RC1 
Spring: 4.1.4.RELEASE 

Ich habe die folgenden Sicherheits config:

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

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

Jetzt, wenn ich versuche, erhalte ich 403-Fehlerseite einloggen:

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

Beschreibung:

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

Was ist falsch, wie kann ich das beheben? Ich habe csrf in der Config kommentiert, aber die Fehlermeldung hat mit der csrf zu tun.

Antwort

23

Wenn Sie es deaktivieren, muss ...

In Spring Security 4, CSRF is enabled by default, wenn die XML-Konfiguration. Zuvor war es nur standardmäßig für die Java-basierte Konfiguration aktiviert.

Nach Section 14.4.2 of the Spring Security Documentation:

Ab Spring Security 4.0, CSRF-Schutz ist standardmäßig mit XML-Konfiguration aktiviert. Wenn Sie den CSRF-Schutz deaktivieren möchten, finden Sie die entsprechende XML-Konfiguration unten.

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

Interessant, aber wie könnte ich eine gültige csrf Token geben, wenn ich möchte csrf benutzen? Ist es möglich? –

20

Deaktivieren CSRF Schutz klingt wie eine schlechte Idee, nicht wahr?

Wenn Sie die Form-Tag-Bibliothek von Spring verwenden, wird das CSRF-Token automatisch eingefügt. Es werden auch HTML-Escape-Formularelementwerte verwendet, wodurch Ihre Site sicherer gegenüber XSS und korrekter wird.

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

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

Andernfalls fügen Sie diese zu Ihrer Form:

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

ich hatte das gleiche Problem. Ich benutze thymeleaf und Spring boot und bekomme das CSRF-Token-Problem, wenn ich versuche, Daten in einem Formular zu posten.

Hier ist meine Arbeitslösung:

  1. diesen verborgenen Eingang hinzufügen:

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

  2. In Ihrem WebSecurityConfig, fügen Sie eine Methode (die WebSecurityConfigurerAdapter erstreckt):

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

    und cod e in Verfahren configure():

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

Ich habe auf dieses Problem viel Zeit. Ich hoffe, es kann jemandem helfen, der das gleiche Problem hat.

+1

Ihre versteckte Eingabe ist eigentlich verborgen. – fivedogit

+1

Ich denke, dass Sie keine zusätzliche Problemumgehung benötigen. Fügen Sie einfach versteckte Eingabe mit th: value und th: name hinzu. – Hamedz

+0

Ich habe das gleiche Problem nach der Hot-Reploads. Ich benutzte JSPs mit der Spring Forms Taglib, also brauchte ich keinen Schritt 1, aber Schritt 2 alleine löste das Problem für mich. – megaflop

3

Um @ St.Antario, Bitte diesen Code verwenden CSRF in Ihrem Code

@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; 
    } 
} 
1

feder 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

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

hinzufügen hinzufügen jsp Login

<%@page session="true"%> 

und Eingang versteckt:

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

Während dieser Code die Frage beantworten kann, bietet zusätzlichen Kontext in Bezug auf wie und/oder warum es löst das Problem würde den langfristigen Wert der Antwort verbessern. – thewaywewere

Verwandte Themen