2013-06-21 25 views
5

Problem scenariusz:laravel 4: Zapobieganie wielokrotne zgłoszenia Form - CSRF Reklamowe

Tworzę blog z laravel 4. Formularz, który jest odpowiedzialny za tworzenie nowych blogach jest zabezpieczony kompilacji w CSRF ochrona (Laravel Docs: CSRF Protection).

Wszystko działa dobrze, ale wygląda na to, że laravel nie odświeża tokenu csrf na każde żądanie.

Wystąpił problem polegający na tym, że jeśli użytkownik kliknie przycisk Wstecz w przeglądarce, aby powrócić do przesłanego formularza, wprowadzone dane będą się powtarzać, a użytkownik będzie mógł ponownie przesłać formularz. Może to stworzyć otwarte drzwi dla spamerów.

Zwykle zapobiega temu token CSRF, ponieważ jest odświeżany przy każdym żądaniu, ale Laravel nie wydaje się tego robić w ten sposób.

Używam podejścia laravel "Kontroler zasobów" (Laravel Docs: Resource Controllers) do obsługi widoków formularza i widoków na blogu. Ponadto używam walidatora wejściowego Laravels przed zapisaniem przesłanych danych wejściowych w bazie danych (MySQL).


Więc następujące pomysły wymyślił:

  1. jakoś zmusić laravel 4 do regeneracji CSRF automatycznie na każde żądanie

  2. wygenerować inny żeton i włączenie go do postaci ręcznie

  3. zapisać znacznik czasu podania formularza w sesji użytkownika (php lub bazie danych) i przepustnicy ne W wysłanych formularza na podstawie czasu

Osobiście preferuję pierwszy pomysł, ale niestety nie mogłem znaleźć sposób zmuszając laravel zachowywać się jak chcę go mieć, bez hacking „Illuminate” Sam (które chcę zachować "tak, jak jest", aby móc aktualizować laravel bez "kłopotów hoff" ^^).

Co byś polecił?

Jak sobie z tym problemem poradziłeś?

+1

Właśnie sprawdziłem jak stackoverflow obsługuje formularz na „history.back()”: w sprawie ponownego przedstawienia z te same dane, mówi: "Pytanie o tym tytule już istnieje, prosimy o bardziej szczegółowe." i "Możesz publikować tylko raz na 20 minut.". Jest opcją, ale tak naprawdę nie jest tym, czego chcę ... –

Odpowiedz

18

Tak naprawdę znalazłem się w tym numerze również w przypadku wielu postów. Masz dwie możliwości:

1) generują nowy token po przedłożeniu postu:

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

2) przekierowanie PO posta stronie potwierdzenia:

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

skończyło do robienia drugiego.

EDIT: W komentarzu poprzez Jason, może być najlepiej użyć kombinacji obu metod przedstawionych powyżej

+0

Używam również przekierowania :: route już do przekierowania do utworzonego posta na blogu po przejściu sprawdzania poprawności. W przypadku błędów sprawdzania poprawności używam Redirect :: back() -> withInput() -> withErrors(). BTW: Jesteś pierwszą odpowiedzią na moje pierwsze pytanie :-) Dzięki. Chciałbym zagłosować na ciebie, ale potrzebuję 15 Rep najpierw ... –

+0

Zawsze możesz zaakceptować jako odpowiedź :) Cieszę się, że pomogę. –

+0

Proszę ... Po prostu zaczekałem, bo może trochę więcej odpowiedzi wypłynęło. –