Открыть сервисСервис

CSRF — межсайтовая подделка запроса

CSRF (от англ. Cross-Site Request Forgery, также известен как XSRF или «межсайтовая подделка запроса») — тип атаки на веб-приложения, при которой злоумышленник подменяет действия аутентифицированного пользователя, заставляя его браузер выполнить нежелательный HTTP-запрос к сайту, где пользователь уже авторизован. Атака использует доверие сервера к сессионным данным (cookie, HTTP-аутентификация), которые браузер отправляет автоматически. CSRF относится к классу атак типа «человек посередине» и «подделка запроса» и входит в список наиболее распространённых уязвимостей веб-приложений по классификации OWASP.

Принцип работы

Предположим, пользователь авторизован на банковском сайте и его браузер хранит сессионную cookie. Если пользователь в это же время посещает вредоносную страницу, содержащую скрытый HTML-форму или JavaScript-код, отправляющий запрос к банковскому API (например, POST /transfer?to=attacker&sum=100000), браузер автоматически приложит к этому запросу валидную сессионную cookie. Сервер, получивший запрос, не может отличить его от запроса, инициированного самим пользователем, и выполнит перевод средств.

Ключевые условия успешности CSRF:

  • пользователь аутентифицирован на целевом сайте;
  • браузер автоматически отправляет учётные данные (cookie, HTTP Basic/дайджест-аутентификация);
  • приложение не применяет дополнительные механизмы защиты от подделки запроса.

Атака не требует доступа к содержимому cookie — достаточно, чтобы браузер пользователя сам их отправил. Это отличает CSRF от атаки XSS, при которой злоумышленник получает прямой доступ к данным страницы.

Способы атаки

Запрос, инициируемый через CSRF, может быть выполнен разными способами:

  • Скрытые HTML-формы — на вредоносной странице размещается <form method="POST" action="https://victim.com/api"> со скрытыми полями и автоматической отправкой через <script>document.forms[0].submit()</script>`.
  • Изображения и ссылки — теги <img src="https://victim.com/delete?id=1"> или <a href>` вызывают GET-запросы. Если приложение использует GET для изменяющих состояние операций, атака упрощается.
  • JavaScript через XMLHttpRequest/fetch — при отсутствии защитных заголовков CORS или SameSite браузер может отправить запрос с cookie к другому origin.
  • CSS и другие векторы — исторически использовались для автоматической подгрузки ресурсов.

GET-запросы, изменяющие состояние сервера, считаются нарушением принципов REST и одновременно главным фактором риска CSRF.

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

Секретные токены (anti-CSRF tokens)

Наиболее распространённый и рекомендуемый метод. Сервер генерирует непредсказуемый токен, связанный с сессией пользователя, и включает его в каждую форму или передаёт в заголовке. При отправке формы сервер проверяет совпадение токена. Так как злоумышленник не может прочитать содержимое страницы целевого сайта (это запрещено политикой same-origin), он не сможет подставить корректный токен.

Реализации: синхронные токены (скрытое поле формы), заголовки X-CSRF-Token, двойная подпись cookie (double-submit cookie).

Заголовок SameSite

Браузеры поддерживают атрибут SameSite для cookie:

  • SameSite=Strict — cookie не отправляется при межсайтовых запросах;
  • SameSite=Lax — cookie отправляется только при навигационных GET-запросах (переход по ссылке), но не при POST из чужого origin;
  • SameSite=None — cookie отправляется всегда (требует Secure).

Атрибут Lax по умолчанию во всех современных браузерах с 2020 года, что существенно снизило актуальность классических CSRF-атак, однако не устраняет их полностью (в частности, для устаревших браузеров и некоторых сценариев).

Проверка заголовка Origin / Referer

Сервер может отклонять запросы, у которых заголовок Origin или Referer указывает на чужой домен. Метод прост, но имеет ограничения: заголовки могут отсутствовать (политика приватности, некоторые прокси) или подделываться в старых браузерах.

Дополнительные меры

  • отсутствие state-changing операций через GET;
  • применение CORS с запретом кросс-доменных запросов с учётными данными;
  • требование повторной аутентификации для критических операций (смена пароля, перевод средств).

История и значимость

Термин «Cross-Site Request Forgery» был введён в 2001 году исследователем Jeremiah Grossman. В 2007 году CSRF был включён в список OWASP Top Ten и с тех пор остаётся одной из ключевых категорий уязвимостей веб-приложений. Известные инциденты: атаки на сервисы Netflix, YouTube (2008), банковские системы ряда стран.

В 2020-е годы, с массовым внедрением SameSite=Lax по умолчанию, частота классических CSRF-атак снизилась, однако метод остаётся актуальным для приложений, использующих устаревшие библиотеки, кастомные схемы аутентификации или нестандартные API.

Источники

  • OWASP — Cross-Site Request Forgery (CSRF) Prevention Cheat Sheet
  • OWASP Top Ten (2021)
  • RFC 3546, RFC 6265 (HTTP State Management Mechanism)
  • Jeremiah Grossman, «Cross-Site Request Forgery» (2001)
  • MDN Web Docs — SameSite cookies
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru