CSRF (англ. Сross Site Request Forgery — «Подделка межсайтовых запросов», также известен как XSRF) — вид атак на посетителей веб-сайтов, суть которого заключается в выполнении действий от имени пользователя без его ведома. Когда пользователь заходит на сайт, созданный злоумышленником, то от его имени на другой сервер тайно отправляется запрос на выполнение некоторого действия (чаще всего это запросы на популярные ресурсы вроде почтовых служб и соцсетей, на которых пользователь с наибольшей вероятностью будет авторизован). Подробнее о CSRF читайте на Википедии.
Основной метод защиты от атак CSRF заключается в следующем:
- Все важные действия пользователя (изменение или удаление данных) должны быть реализованы с помощью отправки формы методом POST.
- При отправке данных нужно сгенерировать случайную строку (подпись), сохранить ее значение в cookies и добавлять во все формы с помощью скрытого элемента вида
<input type="hidden" name="_csrf" value="СОХРАНЁННАЯ_СЛУЧАЙНАЯ_СТРОКА">
. - При получении POST-запросов проверять значение
$_COOKIE['_csrf']
и$_POST['_csrf']
и выполнять действие только в том случае, если значения совпадают. Если это не так, то велика вероятность того, что данные были отправлены с другого сайта.
Защита вашего приложения от CSRF-атак
Чтобы сделать приложения на основе фреймворка Вебасист более безопасными, мы реализовали защиту от атак CSRF на уровне ядра фреймворка. Применить защиту в вашем приложении следует следующим образом:
-
В конфигурационном файле приложения
wa-apps/APP_ID/lib/config/app.php
добавить запись'csrf' => true,
-
В HTML-шаблоны приложения во все формы, отправляющие данные методом POST, добавить хелпер
{$wa->csrf()}
. Эта конструкция автоматически заменится на скрытый элементinput
с нужным значением.
Дальнейшая проверка будет осуществлена фреймворком автоматически. Если подписи не будут совпадать, то фреймворк вернет ответ с ошибкой «403 Forbidden» на этапе инициализации приложения (управление приложению передано не будет).
AJAX
Если вы подключаете в своём приложении скрипт wa-content/js/jquery-wa/wa.core.js
, то параметр _csrf
также автоматически будет добавляться во все запросы, отправляемые методом POST.
Если этот скрипт в вашем приложении не используется, то для защиты от CSRF (при включенном конфигурационном параметре 'csrf' => true
) необходимо во все AJAX-запросы добавлять переменную '_csrf' = get_cookie('_csrf')
.
Реализацию защиты в исходном коде можно посмотреть на примере бесплатного приложения «Блог».