Laravel 4: предотвращение отправки нескольких форм - токен CSRF

Проблемный сценарий:

Я создаю блог с помощью Laravel 4. Форма, отвечающая за создание новых сообщений в блоге, защищена встроенной защитой CSRF ( Laravel Docs: CSRF Protection).

Пока все работает нормально, но похоже, что laravel не обновляет токен csrf при каждом запросе.

Возникающая проблема заключается в том, что если пользователь нажимает кнопку "Назад" браузера, чтобы вернуться к отправленной форме, введенные данные сохраняются, и пользователь может "повторно отправить" форму. Это может создать открытую дверь для спаммеров.

Обычно это предотвращается токеном CSRF, так как он обновляется при каждом запросе, но Laravel, похоже, так не делает.

Я использую подход laravel "Resource Controller" ( Laravel Docs: Resource Controllers) для обработки формы и просмотров блога. Кроме того, я использую валидатор ввода Laravels перед сохранением введенного ввода в базе данных (MySQL).


Итак, возникли следующие идеи:

  1. каким-то образом заставить Laravel 4 автоматически восстанавливать csrf при каждом запросе

  2. создайте другой токен и включите его в форму вручную

  3. сохранить временную метку отправки формы в сеансе пользователя (php или базу данных) и ограничить отправку новой формы на временной основе

Лично я предпочитаю первую идею, но, к сожалению, я не смог найти способ заставить laravel вести себя так, как я хочу, без взлома самого "Просветить" (который я хочу оставить "как есть", чтобы иметь возможность обновлять). Laravel без "ХаслХофф" ^^).

Чтобы вы посоветовали?

Как вы справились с проблемой самостоятельно?

1 ответ

Решение

Я на самом деле столкнулся с этой проблемой также для нескольких сообщений представлений. У вас есть два варианта здесь:

1) Создайте новый токен ПОСЛЕ отправки сообщения:

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

2) Перенаправить ПОСЛЕ сообщения на страницу подтверждения:

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

Я закончил тем, что делал второе.

РЕДАКТИРОВАТЬ: В комментарии через Джейсон, может быть лучше использовать комбинацию обоих методов, изложенных выше

Другие вопросы по тегам