Сценарий проблемы:
Я создаю блог с Laravel 4. Форма, которая отвечает за создание новых сообщений в блоге, обеспечивается сборкой в CSRF-защите ( Laravel Docs: CSRF Protection ).
Пока все работает нормально, но кажется, что laravel не обновляет токен csrf при каждом запросе.
Возникающая проблема заключается в том, что если пользователь обращается к кнопке «Назад» браузера, чтобы вернуться к представленной форме, введенные данные сохраняются, и пользователь может «повторно отправить» форму. Это может создать открытую дверь для спамеров.
Обычно это предотвращается токеном CSRF, поскольку он обновляется по каждому запросу, но Laravel, похоже, не делает этого так.
Я использую laravel «Resource Controller» ( Laravel Docs: Resource Controllers ) для обработки форм и просмотров блога. Кроме того, я использую валидатор ввода Laravels перед сохранением поданного ввода в базе данных (MySQL).
Так появились следующие идеи:
каким-то образом заставить Laravel 4 автоматически обновлять csrf при каждом запросе
сгенерировать еще один токен и включить его в форму вручную
сохранить временную метку представления формы в сеансе пользователей (php или базу данных) и подавать новые формы на основе времени
Лично я предпочитаю первую идею, но, к сожалению, я не мог найти способ заставить laravel вести себя так, как я этого хочу, без взлома самого «Illuminate» (который я хочу сохранить «как есть», чтобы иметь возможность обновлять laravel без «hassle hoff » ^^).
Чтобы вы посоветовали?
Как вы сами справлялись с проблемой?
Я на самом деле столкнулся с этой проблемой и для нескольких сообщений. У вас есть два варианта:
1) Создайте новый токен ПОСЛЕ отправки сообщения:
Session::put('_token', sha1(microtime()))
2) Перенаправить по почте на страницу подтверждения:
Redirect::route('form/success')->with("data", $myData)
Я закончил делать второе.
EDIT: в комментарии через Джейсона может быть лучше использовать комбинацию обоих методов, описанных выше