CSRF

CSRF (англ. Сross Site Request Forgery — «Подделка межсайтовых запросов», также известен как XSRF) — вид атак на посетителей веб-сайтов, суть которого заключается в выполнении действий от имени пользователя без его ведома. Когда пользователья заходит на сайт, созданный злоумышленником, то от его имени на другой сервер тайно отправляется запрос на выполнение некоторого действия (чаще всего это запросы на популярные ресурсы вроде почтовых служб и соцсетей, на которых пользователь с наибольшей вероятностью будет авторизован). Подробнее об CSRF читайте на Википедии.

Основной метод защиты от атак CSRF заключается в следующем:

  1. Все важные действия пользователя (изменение или удаление данных) должны быть реализованы с помощью отправки формы методом POST.
  2. При отправке данных нужно сгенерировать случайную строку (подпись), сохранить ее значение в куках (cookies) и добавлять во все формы с помощью скрытого инпута <input type="hidden" name="_csrf" value="СОХРАНЁННАЯ_СЛУЧАЙНАЯ_СТРОКА">
  3. При получении запросов POST проверять значение из $_COOKIE['_csrf'] и $_POST['_csrf'] и выполнять действие только в том случае, если значения совпадают. Если это не так, то скорее всего форма была отправлена с другого сайта.

Чтобы сделать приложения на основе фреймворка Вебасист более безопасными, мы реализовали защиту от атак CSRF на уровне ядра фреймворка. Применить защиту в вашем приложении следует следующим образом:

  • В конфигурационном файле вашего приложения wa-apps/[APP_ID]/lib/config/app.php необходимо указать 'csrf' => true
  • В шаблонах во все формы с method=POST добавить {$wa->csrf()}
    Эта конструкция автоматически заменится на скрытый input с нужным значением.
  • Дальнейшая проверка будет осуществлена фреймворком автоматически. Если подписи не будут совпадать, то фреймворк вернет ответ с ошибкой 403 Forbidden на этапе инициализации приложения (управление приложению передано не будет).

AJAX: Если вы подключаете в своём приложении скрипт wa-content/js/jquery-wa/wa.core.js, то параметр _csrf также автоматически будет добавляться во все AJAX-запросы, отправляемые методом POST. Если этот скрипт не подключается, то для защиты от CSRF (при включенном 'csrf' => true в конфиге) вам необходимо во все запросы добавлять переменную '_csrf' = get_cookie('_csrf').

Описанный механизм требует от пользователя включенных куки (cookies), и поэтому в данный момент реализован только для бекенда Вебасиста. Реализацию защиты в коде можно посмотреть на примере приложения «Блог».