В микрофреймворке
HLEB реализована защита маршрутов от атак типа
CSRF (Сross Site Request Forgery), но применять её можно опционально.
Сделано это для максимальной гибкости разработки, поэтому необходимо вручную назначить защиту маршрутам, которые в этом нуждаются.
Суть защиты состоит в том, что запрос, попадающий на защищённый маршрут, должен иметь параметр
GET или
POST с уникальным проверочным ключом,
в противном случае запрос будет отклонён. Например, нужно передать данные из html-формы методом
POST. Запрос этот должен быть направлен на
маршрут с установленной защитой. Чтобы отправить с запросом уникальный ключ, необходимо в форме разместить специальную функцию
csrf_field().
<form method="POST" name="protected" action="/target/" >
/* Данные формы */
<?php csrf_field(); ?> // Добавит строку <input type="hidden" name="_token" value="KEY"> , где KEY это сгенерированный ключ.
</form>
Защита маршрута c адресом
"/target/".
Route::protect()->post('/target/', 'Этот текст защищён от CSRF');
В случае, если нужно защитить
Ajax-запросы, к каждому из них добавляется параметр
"_token" со значением уникального ключа. Естественно, эти запросы должны обрабатываться защищёнными маршрутами. Получить уникальный ключ можно выполнив PHP-функцию
csrf_token(),
отобразить его в html-коде, затем найти полученный результат на странице и добавить к запросу при помощи
JavaScript. Например, вывод ключа в мета-теги страницы:
<meta name="csrf-token" content="<?= csrf_token(); ?>" >
Ещё один встроенный способ - автогенерация защищённой ссылки с параметром
"_token". Функция
getProtectUrl() добавляет к переданному ей аргументу (URL-адресy) необходимый
GET-параметр.
По этой ссылке текущий пользователь может переходить на любую защищённую страницу.
Методы getProtect(), endProtect() и protect()
Групповая защита выбранных маршрутов реализуется расстановкой начального метода
getProtect() и завершающего
endProtect().
Route::getProtect(); // Начало защиты
Route::get( ... );
Route::get( ... );
Route::get( ... );
Route::endProtect(); // Завершение защиты
Метод
protect() устанавливает защиту к отдельно взятому маршруту или группе, обозначенной применением
getGroup().
Исключение метода из защищённых
Если передать методу
protect() аргумент
"None", то он исключает маршрут или группу из защищённых.
Route::getProtect();
Route::get( ... ); // Защищён
Route::protect('None')->get( ... ); // Не защищён
Route::get( ... ); // Защищён
Route::endProtect();