[FormIt] Хук проверки токена CSRF

Приветствую всех в новом году! А православных поздравляю с Рождеством Христовым! В этой статье я покажу как с помощью библиотеки modHelpers защитить форму от CSRF атаки при использовании дополнения FormIt. Механизм защиты сайта был подробно описан в этой статье. Рекомендую с ней ознакомиться.

Мы знаем, что подключить свою логику к FormIt можно через хуки. Хук — это сниппет. Поэтому создаём сниппет и даем ему название «csrf». Он содержит всего несколько строчек:

if(request()->checkCsrfToken('post')===false){// Выставляем плейсхолдер ошибки
    $hook->addError('csrf','Ошибка! Указан некорректный токен.');returnfalse;}returntrue;

Он срабатывает только для формы, переданной POST методом. Теперь нужно создать форму. Для демонстрации возьмём такую простенькую:

<!-- Плейсхолдер ошибки --><divclass="error">[[!+fi.error.csrf]]</div><formmethod="post"class="form">
    {csrf_field()}
    <divclass="form-group"><labelfor="name">Имя:</label><inputtype="text"name="name"id="name"value="[[!+fi.name]]"/></div><divclass="form-group"><labelfor="email">Email:</label><inputtype="email"name="email"id="email"value="[[!+fi.email]]"/></div><divclass="form-buttons"><inputtype="submit"class="btn btn-default"value="Отправить"/></div></form>

У формы должно быть скрытое полей с токеном. Его можно вставить с помощью функции csrf_field(). Теперь форма готова к защите. Осталось вызвать сниппет FormIt с нашим хуком перед формой. Хуки срабатывают в порядке подключения. Поэтому указать его нужно самым первым.

[[!FormIt?&hooks=`csrf,email`...]]

В результате, при обработке запроса формы сниппет FormIt в первую очередь проверит токен. Если он не совпадёт с токеном пользователя или вообще отсутствует, то FormIt вернёт ошибку, и форма обрабатываться не будет.

Такая защита, кроме того, поможет оградить форму от большинства stateless (не использующих сессию) роботов и спамеров.