2013-08-22 6 views
9

Ich spiele gerade mit Laravel 4. Derzeit bin ich implementiert die CSRF-Token-Sicherheit auf Formular Post.Warum Laravel 4 CSRF-Token funktioniert nicht?

Das Problem ist, dass dies eigentlich nicht im Sinne arbeitet, dass das Token in der Sitzung erzeugte Session::token() ist immer gleich so, wenn ich versuche, eine Form erneut einzureichen oder sogar eine Form von einem anderen Server veröffentlichen, um die Sicherheit Überprüfung funktioniert nicht Session::token() != Input::get('_token') (filters.php)

Wer war schon mit diesem Problem konfrontiert?

EDIT:
Ok ich fand die Erklärung dafür. Das Token ist für jeden Computer/jede Sitzung tatsächlich unterschiedlich. Es macht mehr Sinn, jetzt :) Vielen Dank an alle für Ihre Hilfe

Antwort

1

Im Inneren der Form der Code so zu schaffen haben:

<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>"> 

Danach wird das Token mit dem Eingang gesendet wird. Also, wenn Sie die Eingabe erhalten Sie das Token wie folgt überprüfen:

Route::post('register', array('before' => 'csrf', function() 
{ 
    return 'You gave a valid CSRF token!'; 
})); 

diese Weise können Sie einen Filter setzen, bevor die Route zugegriffen wird, dass die CSRF-Token überprüft.

dies aus der Dokumentation Laravel Got rechts here

+0

Vielen Dank für Ihre Antwort. Ich habe das alles gemacht, aber mein Problem betrifft das Token selbst, das nicht aktualisiert wird. Selbst wenn ich die Seite aktualisiere, ist das Token immer noch dasselbe, so dass der Filter immer true zurückgibt. – lkartono

9

wenn das Formular abgeschickt wird, nachdem die Form der Verarbeitung Sie die CSRF wie Session::put('_token', md5(microtime())); Token dies von der Form Wiedervorlage schützt .. für weitere Informationen ändern, sollten Sie sehen können this und this

+1

Vielen Dank für Ihre Antwort. In der Tat, das ist bisher der einzige Weg, der funktioniert, aber ich denke, das ist wirklich dumm, Entwicklern einen csrf-Token-Sicherheitscheck aus der Schachtel zu geben, wenn wir uns noch um diese Art von Details kümmern müssen. Das sollte funktionieren out of the box :(Danke nochmal – lkartono

+0

Wow. Ich habe das gerade getestet und habe das gleiche Token mehrfach erhalten.Sie müssen sich fragen, was sie denken, dass der Punkt eines CSRF-Tokens ist .... Ich frage mich, ob es in 5 behoben ist. – DanielM

3

ich verwende die eingebaute in regenerateToken Funktion auf diese Weise in meinem app/filter.php:

Route::filter('csrf', function() 
{ 
    if (Session::token() != Input::get('_token')) 
    { 
     Session::regenerateToken(); 
     return *Redirect/Exception* 
    } 
    Session::regenerateToken(); 
}); 

Ein weiterer Hinweis, wenn Sie mit Eingabe umleiten!

In Laravel 4 das Token generiert wird, wenn Sie {{Formular :: open (...)}} auf diese Weise:

public function token() 
{ 
    return $this->hidden('_token', $this->csrfToken); 
} 

So verwendet er einen versteckten Eingang, der seine gesetzt Wert von Input :: alte Funktion, wenn sie existiert.

Um dies zu verhindern, dass Sie Eingabe verwenden, benötigen :: außer (‚_ token‘), wenn Sie möchten nicht ein Formular mit einer bereits veralteten Token wie diese machen:

return Redirect::route('routename')->withInput(Input::except('_token')); 
0

Wenn Sie Blade zum Erstellen des Formulars, das _Token wird automatisch innerhalb des Formulars gerendert