2017-09-20 2 views
1

Ich benutze Symfony 3.1 mit FOS-Benutzerpaket. Ich angemeldet (im Inkognito-Modus)Symfony 3.1 CSRF-Token nicht gültig im Login-Formular

Ich bemerkte, dass in der ersten Anfrage

Ich erhalte eine „CSRF ungültigen Token“ Nachricht für die Anmeldung zum ersten Mal bilden, ich ein Token erhalten. Dann aktualisiere ich die Seite und erhalte eine weitere. Von nun an bekomme ich das gleiche Token (und funktioniert korrekt). Zum Beispiel:

1st request: maJl7bBRR0iuOX4A96cOxrsLdklBIxz3mCP7fSMGqQY 
2nd request: q21SVH98tbMLeRIypv2aTn0xBDXJ1khrcL8fIMOU4Y8 
3rd request: q21SVH98tbMLeRIypv2aTn0xBDXJ1khrcL8fIMOU4Y8 
4th request: q21SVH98tbMLeRIypv2aTn0xBDXJ1khrcL8fIMOU4Y8 

Ich habe zweimal getestet, was zu dem gleichen Verhalten führte.

Es scheint nicht ein Browser-Cache Problem, weil der Header zu sein:

Cache-Control:no-cache 

Die csrf Eingabe in Form wie folgt generiert:

<input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}"> 

Nachdem der erste ausfällt Zeit, alles geht gut (das 2. csrf Token funktioniert einwandfrei)

Ich möchte die Validierung nicht beim ersten Mal fehlschlagen, weil ich mich wegen des CSRF-Tokens anmelde, von dem ich vermute, dass es fehlschlägt se von dem, was ich oben erwähnt habe. Entfernen von CSRF-Schutz ist keine Lösung.

Danke!

UPDATE

fand ich das Problem aber nicht die Lösung. Das Projekt speichert die Sitzungsdaten in MySQL. Beim ersten Zugriff werden die Daten nicht in die Datenbank eingefügt, bei der zweiten jedoch. Die Daten sind in $ _SESSION vorhanden, aber da sie nicht das erste Mal in MySQL gespeichert wird, ist das csrf-Token verloren. (Ich fand das Protokollieren der Abfragen, die von der App gemacht wurden, dank dieser How to show the last queries executed on MySQL?).

Das Speichern der Sitzung in Dateien funktioniert einwandfrei. Dies ist keine Lösung, da es mehrere Instanzen der App auf verschiedenen Servern geben wird.

Antwort

0

Das Problem war, dass in einem Dienst in fast allen der App verwendet wird, gibt es eine

$session = new Session(); 

war die aus irgendeinem Grund die PDO Session Handler verursacht nicht eingestellt werden.

Die Lösung war die Sitzung auf den Dienst

public function __construct(..., Session $session) 

und in der service.yml injizieren es wie

- '@session' 
zu injizieren
Verwandte Themen