2016-06-24 36 views
0

Ich schreibe gerade die Sicherheit für eine REST-Webanwendung und als ich endlich einen benutzerdefinierten CSRF-Filter erhalte, merke ich, dass ich nichts in meine POST-Datei schreiben kann/Login, weil ich das CSRF-Token brauche (ein GET ist aber möglich). Die Sache ist, wie kann ich das Token zum ersten Mal abrufen, damit ich es in das POST-Formular hinzufügen kann, das zum Login geht?Benutzerdefinierter CSRF-Filter für Spring Security ignoriert nicht meine/login

Ich benutze Postman als meine REST-Client und die einzige Möglichkeit, wie ich das Token erhalten kann, ist zuerst eine Dummy GET, so dass ich das Token abrufen und dann in den POST hinzufügen kann, aber ich nehme an, dies könnte nicht so sein.

Ich bin neu in Web-Sicherheit, csrf und bin auch kein Front-End-Entwickler, also könnte das Problem dort liegen.

PD: Meine Sicherheit:

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

    http  
     .addFilterAfter(new CsrfTokenResponseHeaderBindingFilter(), CsrfFilter.class) 
     .authorizeRequests() 
     .antMatchers("/login").permitAll().anyRequest().authenticated(); 

    http 
     .formLogin().loginPage("/login").permitAll().successHandler(authenticationSuccessHandler) 
     .failureHandler(authenticationFailureHandler) 
     .and() 
     .rememberMe().rememberMeParameter("remember-me").tokenValiditySeconds(2000) 
     .and() 
     .exceptionHandling().authenticationEntryPoint(authenticationEntryPoint) 
     .and() 
     .sessionManagement().maximumSessions(1); 

} 

auch versucht, diese, aber nicht gut:

@Override 
public void configure(WebSecurity webSecurity) throws Exception 
{ 
    webSecurity 
     .ignoring().antMatchers("/login").anyRequest(); 

} 

Ich verwende diesen benutzerdefinierten Filter, Kredite an den Autor: https://github.com/aditzel/spring-security-csrf-filter

PD2: Falls ich nicht klar genug war, möchte ich mich mit einem POST einloggen, ohne zuerst den Dummy zu machen. Ich weiß nicht, ob es sich um ein Code-Problem oder ein konzeptionelles (sicherheitsrelevantes) Problem handelt.

Antwort

0

Ihre Konfiguration für die Authentifizierung und CSRF eignen sich für eine browserbasierte Webanwendung, in der Sie die "Anmeldeseite" mit der GET-Anforderung laden und anschließend die Anmeldeinformationen senden. Aus diesem Grund können Sie das Token nach dem Aufruf der GET-Anfrage sehen.

Wenn Sie den sitzungsbasierten CSRF-Schutz beibehalten möchten, müssen Sie das CSRF-Token mit der anfänglichen GET-Anforderung abrufen und für nachfolgende Anforderungen verwenden.

ist hier ein etwas verwandter Faden - How to prevent CSRF in a RESTful application?

+0

So war es ein konzeptionelles Problem, nachdem alle. Zwei Dinge mehr: es ist sicher, dass? Ich meine, jeder REST-Endpunkt, der ein GET erhält, ruft das CSRF-Token ab, sogar nicht authentifizierte GETs (natürlich ohne authentifizierten Cookie, auch nicht authentifizierte Petitionsantwort ist ein 401-Fehler). Zweitens: In einem Produktions-Release mit seinem Frontend, wenn ich die Umleitungen und Routing-Sachen mache, ist es notwendig, dass ein GET es an den Server sendet, damit es zuerst das CSRF-Token abrufen kann und den Benutzer dann im Login-Menü belassen? Oder sollte der Ansatz anders sein? Ich werde die Antwort abstimmen, nachdem diese beiden gelöst sind –

+0

Die beiden Konzepte und Authentifizierung) sind verwandt, aber anders. CSRF soll sicherstellen, dass alle Anrufe von derselben Quelle kommen. Das heißt, niemand kann die URL ohne das Token kopieren und wiederverwenden. Bei der Authentifizierung muss sichergestellt werden, dass der Aufrufer –

+0

ist. Nach CSRF ist weiterhin eine Authentifizierung erforderlich, um sicherzustellen, dass der Aufrufer die richtigen Anmeldeinformationen bereitstellt und die Sitzung authentifiziert wird. Benötigt möglicherweise keinen CSRF für den REST-Endpunkt, der keine Sitzung benötigt. –