Что такое CSRF (Cross-Site Request Forgery)?
CSRF (Cross-Site Request Forgery) — это уязвимость веб-приложений, которая позволяет злоумышленнику заставить пользователя выполнить нежелательное действие в системе, где он уже авторизован. Основная опасность заключается в том, что атака использует доверие между пользователем и веб-приложением, при этом жертва даже может не подозревать, что её действия инициированы злоумышленником.
Суть атаки CSRF
При атаке CSRF злоумышленник подготавливает специальный запрос к целевому сайту, например, перевод денег, смену пароля или отправку формы. Если жертва в этот момент авторизована на сайте и её сессия активна, браузер автоматически прикрепит к запросу необходимые куки или токены аутентификации. В итоге сервер воспримет запрос как легитимный и выполнит его от имени жертвы.
Пример: пользователь вошёл в свой интернет-банк и оставил сессию открытой. Злоумышленник присылает жертве ссылку или подсовывает страницу с изображением, в атрибуте src которого подставлен запрос на перевод денег. Когда браузер загружает эту страницу, он автоматически отправляет запрос с сессионными данными, и операция выполняется.
Ключевые особенности CSRF
-
Используется доверие к браузеру: сервер полагается на куки или сессионные данные, которые автоматически отправляются браузером.
-
Жертва не осознаёт атаку: она может просто кликнуть на ссылку, открыть сайт или даже загрузить изображение, и этого достаточно для выполнения действия.
-
Злоумышленник не получает прямого доступа к данным: цель атаки — не похищение информации, а выполнение действий от имени пользователя.
Примеры атак CSRF
-
Финансовые транзакции — перевод средств со счёта жертвы на счёт злоумышленника.
-
Изменение настроек — смена пароля, email или номера телефона.
-
Социальные сети — отправка сообщений, лайков или публикация постов от имени жертвы.
-
Административные панели — выполнение действий с повышенными правами, если жертва является администратором.
Методы защиты от 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 эксплуатирует доверие между пользователем и сервером.