В этой статье я покажу как с помощью библиотеки modHelpers защитить форму от CSRF атаки при использовании дополнения FormIt. Механизм защиты сайта был подробно описан в этой статье.
Мы знаем, что подключить свою логику к FormIt можно через хуки. Хук — это сниппет. Поэтому создаём сниппет и даем ему название «csrf». Он содержит всего несколько строчек:
if (request()->checkCsrfToken('post') === false) {
// Выставляем плейсхолдер ошибки
$hook->addError('csrf','Ошибка! Указан некорректный токен.');
return false;
}
return true;
Он срабатывает только для формы, переданной POST методом. Теперь нужно создать форму. Для демонстрации возьмём такую простенькую:
<!-- Плейсхолдер ошибки -->
<div class="error">[[!+fi.error.csrf]]</div>
<form method="post" class="form">
{csrf_field()}
<div class="form-group">
<label for="name">Имя:</label>
<input type="text" name="name" id="name" value="[[!+fi.name]]" />
</div>
<div class="form-group">
<label for="email">Email:</label>
<input type="email" name="email" id="email" value="[[!+fi.email]]" />
</div>
<div class="form-buttons">
<input type="submit" class="btn btn-default" value="Отправить" />
</div>
</form>
У формы должно быть скрытое полей с токеном. Его можно вставить с помощью функции csrf_field(). Теперь форма готова к защите. Осталось вызвать сниппет FormIt с нашим хуком перед формой. Хуки срабатывают в порядке подключения. Поэтому указать его нужно самым первым.
[[!FormIt?
&hooks=`csrf,email`
...
]]
В результате, при обработке запроса формы сниппет FormIt в первую очередь проверит токен. Если он не совпадёт с токеном пользователя или вообще отсутствует, то FormIt вернёт ошибку, и форма обрабатываться не будет.