Last active
February 10, 2018 07:00
-
-
Save FroggyWeb/2dde4d2844aa809240c891f36fbda32d to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| В этой статье я покажу как с помощью библиотеки 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 вернёт ошибку, и форма обрабатываться не будет. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment