Laravel 4: предотвращение отправки нескольких форм - токен CSRF
Проблемный сценарий:
Я создаю блог с помощью 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 вести себя так, как я хочу, без взлома самого "Просветить" (который я хочу оставить "как есть", чтобы иметь возможность обновлять). Laravel без "ХаслХофф" ^^).
Чтобы вы посоветовали?
Как вы справились с проблемой самостоятельно?
1 ответ
Я на самом деле столкнулся с этой проблемой также для нескольких сообщений представлений. У вас есть два варианта здесь:
1) Создайте новый токен ПОСЛЕ отправки сообщения:
Session::put('_token', sha1(microtime()))
2) Перенаправить ПОСЛЕ сообщения на страницу подтверждения:
Redirect::route('form/success')->with("data", $myData)
Я закончил тем, что делал второе.
РЕДАКТИРОВАТЬ: В комментарии через Джейсон, может быть лучше использовать комбинацию обоих методов, изложенных выше