webentwicklung-frage-antwort-db.com.de

Ungültiger CSRF-Token 'null' wurde im Anforderungsparameter '_csrf' oder im Header 'X-CSRF-TOKEN' gefunden.

Nach der Konfiguration von Spring Security 3.2 ist _csrf.token nicht an eine Anforderung oder ein Sitzungsobjekt gebunden.

Dies ist die Frühlingssicherheitskonfiguration:

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

Die login.jsp-Datei

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

Und es rendert das nächste HTML:

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

Das Ergebnis ist 403 HTTP-Status:

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

UPDATE Nach einem Debug wird das Anforderungsobjekt aus DelegatingFilterProxy herausgegeben, aber in der Zeile 469 von CoyoteAdapter führt es request.recycle () aus. das löscht alle Attribute ...

Ich teste in Tomcat 6.0.36, 7.0.50 mit JDK 1.7.

Ich habe dieses Verhalten nicht verstanden, sondern es wäre möglich, wenn mir jemand mit Spring Security 3.2, das mit CSRF arbeitet, in die Richtung eines Anwendungsbeispiels führt.

81
Hugo Robayo

Anscheinend ist der CSRF-Schutz (Cross Site Request Forgery) in Ihrer Spring-Anwendung aktiviert. Eigentlich ist es standardmäßig aktiviert. 

Laut spring.io :

Wann sollten Sie den CSRF-Schutz verwenden? Unsere Empfehlung ist die Verwendung von CSRF Schutz für jede Anforderung, die von einem Browser verarbeitet werden kann, durch normale Benutzer. Wenn Sie nur einen Dienst erstellen, der von .__ verwendet wird. Nicht-Browser-Clients möchten Sie wahrscheinlich den CSRF-Schutz deaktivieren.

Also um es zu deaktivieren:

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

Wenn Sie jedoch den CSRF-Schutz aktiviert lassen möchten, müssen Sie die Variable csrftoken in Ihr Formular aufnehmen. Sie können es so machen:

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

Sie können sogar das CSRF-Token in die Aktion des Formulars aufnehmen:

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

Sollten Sie das Anmeldeformular nicht hinzufügen ?;

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

Wie im hier in der Spring-Sicherheitsdokumentation angegeben

28
borjab

wenn Sie security = "none" anwenden, wird kein csrf-Token generiert. Seite wird nicht durch den Sicherheitsfilter geleitet. Verwenden Sie die Rolle ANONYMOUS.

Ich bin nicht ins Detail gegangen, aber es funktioniert für mich.

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

Spring-Dokumentation zum Deaktivieren von 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();
   }
}
6
Rahul Raj

Mit thymeleaf können Sie hinzufügen:

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

Versuchen Sie, dies zu ändern: <csrf />: <csrf disabled="true"/>. Es sollte csfr deaktivieren.

6
Arkadiusz Gibes

Ich hatte früher das gleiche Problem.

Ihre config use security = "none" kann also keine _csrf generieren:

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

sie können access = "IS_AUTHENTICATED_ANONYMOUSLY" für die Seite /login.jsp setzen, die die obige Konfiguration ersetzt:

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

ich glaube, csrf funktioniert nur mit frühlingsformen

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

wechseln Sie zu form:form-Tag und sehen Sie, dass es funktioniert.

2
Saurabh Kumar

Bitte sehen Sie sich meine Arbeitsbeispielanwendung auf Github an und vergleichen Sie mit Ihrem Setup.

1
manish

Keine der Lösungen funktionierte von mir. Die einzige, die für mich in Frühlingsform gearbeitet hat, ist:

action = "./ upload? $ {_ csrf.parameterName} = $ {_ csrf.token}"

ERSETZT MIT:

action = "./ upload? _csrf = $ {_ csrf.token}"

(Spring 5 mit aktivierter CSRF in Java-Konfiguration)

1
vancho

Fügen Sie in Ihrem Controller Folgendes hinzu:

@RequestParam(value = "_csrf", required = false) String csrf

Und auf der JSP-Seite hinzufügen

<form:form modelAttribute="someName" action="someURI?${_csrf.parameterName}=${_csrf.token}
0
Taras Melnyk