2013-06-21 15 views
5

Problem Szenario:Laravel 4: Verhindern, dass mehrere Formularübermittlungen - CSRF-Token

Ich bin ein Blog mit Laravel 4. Die Form schaffen, die für die Schaffung neuer Blog-Beiträge verantwortlich ist durch den Bau in CSRF gesichert Schutz (Laravel Docs: CSRF Protection).

Alles funktioniert soweit, aber es scheint, dass Laravel das csrf-Token nicht bei jeder Anfrage aktualisiert.

Das Problem, das ist auftritt, wenn der Benutzer die Zurück-Schaltfläche des Browsers zu dem eingereichten Formular zurückzukehren trifft, ist die eingegebenen Daten bestehen bleiben und der Benutzer in der Lage „erneut einreichen“ das Formular aus. Dies könnte eine offene Tür für Spammer schaffen.

Normalerweise wird dies durch das CSRF-Token verhindert, da es bei jeder Anfrage aktualisiert wird, aber Laravel scheint es nicht so zu machen.

Ich benutze die Laravel "Resource Controller" -Ansatz (Laravel Docs: Resource Controllers), um die Form und Blogpost Ansichten zu behandeln. Außerdem benutze ich Laravels Input Validator, bevor ich die übergebene Eingabe in der Datenbank (MySQL) ablege.


So kamen die folgenden Ideen:

  1. irgendwie 4 zwingen Laravel die csrf automatisch bei jeder Anfrage ein anderes Token

  2. erzeugen zu regenerieren und schließen sie in die Form manuell

  3. Speichern Sie einen Zeitstempel der Formularunterordnung in der Benutzersitzung (PHP oder Datenbank) und drosseln Sie ne w Formulare auf einer Zeitbasis

Persönlich bevorzuge ich die erste Idee, aber leider konnte ich nicht einen Weg zu zwingen Laravel verhalten finden, wie ich es sein, will die „Illuminate“ selbst ohne Hacking (welches ich "wie es ist" beibehalten möchte, um laravel ohne "stress hoff" ^^) zu aktualisieren.

Was würden Sie empfehlen?

Wie haben Sie das Problem selbst gelöst?

+1

Ich habe gerade überprüft, wie Stackoverflow das Formular auf Griffe „history.back()“: Auf Wieder äussern die gleichen Daten, es sagt "Eine Frage mit diesem Titel existiert bereits; bitte seien Sie spezifischer." und "Sie können nur einmal alle 20 Minuten posten". Ist eine Option, aber nicht wirklich, was ich will ... –

Antwort

18

Ich lief in diesem Problem auch für mehrere Beiträge Beiträge. Sie haben zwei Möglichkeiten:

1) Erstellen Sie ein neues Token nach Post Vorlage:

Session::put('_token', sha1(microtime()))

2) Redirect nach Post auf eine Bestätigungsseite:

Redirect::route('form/success')->with("data", $myData)

I ended bis zum zweiten.

EDIT: In einem Kommentar über Jason, kann es am besten sein, die Kombination der beiden oben beschriebenen Methoden zu verwenden

+0

Ich benutze auch eine Redirect :: Route bereits um den erstellten Blogpost nach der Validierung weiterzuleiten. Im Falle von Validierungsfehlern verwende ich Redirect :: back() -> withInput() -> withErrors(). BTW: Du bist der erste, der meine erste Frage beantwortet :-) Danke. Ich würde dich wählen, aber brauche 15 Repräsentanten zuerst ... –

+0

Du könntest immer als Antwort annehmen :) Froh, zu helfen. –

+0

Da gehen Sie ... Ich habe nur gewartet, weil einige weitere Antworten hätten sprudeln könnte. –

Verwandte Themen