Что такое CSRF (Cross-Site Request Forgery)?

CSRF (Cross-Site Request Forgery) — это уязвимость веб-приложений, которая позволяет злоумышленнику заставить пользователя выполнить нежелательное действие в системе, где он уже авторизован. Основная опасность заключается в том, что атака использует доверие между пользователем и веб-приложением, при этом жертва даже может не подозревать, что её действия инициированы злоумышленником.

Суть атаки CSRF

При атаке CSRF злоумышленник подготавливает специальный запрос к целевому сайту, например, перевод денег, смену пароля или отправку формы. Если жертва в этот момент авторизована на сайте и её сессия активна, браузер автоматически прикрепит к запросу необходимые куки или токены аутентификации. В итоге сервер воспримет запрос как легитимный и выполнит его от имени жертвы.

Пример: пользователь вошёл в свой интернет-банк и оставил сессию открытой. Злоумышленник присылает жертве ссылку или подсовывает страницу с изображением, в атрибуте src которого подставлен запрос на перевод денег. Когда браузер загружает эту страницу, он автоматически отправляет запрос с сессионными данными, и операция выполняется.

Ключевые особенности CSRF

  • Используется доверие к браузеру: сервер полагается на куки или сессионные данные, которые автоматически отправляются браузером.

  • Жертва не осознаёт атаку: она может просто кликнуть на ссылку, открыть сайт или даже загрузить изображение, и этого достаточно для выполнения действия.

  • Злоумышленник не получает прямого доступа к данным: цель атаки — не похищение информации, а выполнение действий от имени пользователя.

Примеры атак CSRF

  1. Финансовые транзакции — перевод средств со счёта жертвы на счёт злоумышленника.

  2. Изменение настроек — смена пароля, email или номера телефона.

  3. Социальные сети — отправка сообщений, лайков или публикация постов от имени жертвы.

  4. Административные панели — выполнение действий с повышенными правами, если жертва является администратором.

Методы защиты от CSRF

Использование токенов (Anti-CSRF tokens)

Каждый запрос, изменяющий состояние приложения, должен содержать уникальный и непредсказуемый токен, связанный с текущей сессией пользователя. Так как злоумышленник не может предугадать этот токен, его запрос будет отклонён.

Проверка заголовков

Можно проверять заголовок Origin или Referer, чтобы убедиться, что запрос исходит с доверенного домена. Это не абсолютная защита, но хороший дополнительный механизм.

Ограничение методов запросов

Чувствительные операции рекомендуется выполнять только через методы POST, PUT или DELETE, а не через GET, чтобы уменьшить вероятность подделки запросов через простую ссылку или изображение.

SameSite cookies

Современные браузеры поддерживают флаг SameSite для cookie, который запрещает отправку их с кросс-доменных запросов. Это значительно снижает риск CSRF.

Многофакторная аутентификация

Даже если CSRF-запрос прошёл, наличие дополнительных факторов аутентификации (например, SMS или OTP при переводе средств) делает атаку бесполезной.

Отличие CSRF от XSS

Хотя XSS и CSRF часто путают, это разные уязвимости.

  • При XSS злоумышленник внедряет код в страницу, и он выполняется в браузере жертвы.

  • При CSRF злоумышленник подталкивает браузер жертвы к отправке запроса с уже имеющимися авторизационными данными.

Иными словами, XSS атакует сам браузер и доверие к содержимому страницы, а CSRF эксплуатирует доверие между пользователем и сервером.