Приветствую всех в новом году! А православных поздравляю с Рождеством Христовым! В этой статье я покажу как с помощью библиотеки 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 вернёт ошибку, и форма обрабатываться не будет.

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

07 января 2018, 15:42   502     0

Комментарии ()

    Вы должны авторизоваться, чтобы оставлять комментарии.

    Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.