Глоссарий

Что такое CSRF (Cross-Site Request Forgery): атака, заставляющая вошедшего пользователя отправлять запросы, которых он не собирался отправлять

CSRF заставляет браузер вошедшего пользователя отправить запрос, которого он не хотел. Как это работает и защита: CSRF-токены, куки SameSite, проверка Origin.

Опубликовано 2026-06-08 Обновлено 2026-10-06 6 мин чтения
На этой странице

CSRF — это когда простое открытие другого сайта, пока вы в системе, без вашего ведома запускает перевод или изменение настроек. Разберём, как он работает и как надёжно его предотвратить (без шагов атаки).

Почему это работает (механизм)

Браузер автоматически прикрепляет куки сайта к запросам к этому сайту. Поэтому если пользователь вошёл в свой банк, запрос к банку, инициированный с вредоносной страницы, всё равно несёт «куки пользователя». Для сервера он неотличим от легитимного действия.

① Пользователь вошёл на целевой сайт (держит куки)
↓ он открывает другую страницу
② Вредоносная страница инициирует запрос к целевому сайту
↓ браузер автоматически прикрепляет куки целевого сайта
③ Сервер выполняет его как «действие пользователя» (перевод, настройки…)
Поскольку браузер автоматически отправляет куки, запрос «через другой сайт» проходит как собственное действие пользователя.

Если XSS «выполняет код в браузере жертвы», то CSRF «заимствует активный сеанс жертвы» (→ Что такое XSS).

Защита

1

Требуйте CSRF-токен

На действиях, меняющих состояние (отправка форм, API), требуйте непредсказуемый одноразовый токен, выданный сервером; отклоняйте запросы без него. Большинство фреймворков это поставляют.

2

Установите куки SameSite

Помечайте сеансовые куки SameSite=Lax (или Strict), чтобы куки не прикреплялись к запросам, исходящим с других сайтов. Lax — современное значение по умолчанию и сам по себе сильно помогает.

3

Не используйте GET для изменений состояния

GET (просмотр) не должен иметь побочных эффектов. Делайте изменения через POST/PUT/DELETE и пропускайте их через проверку токена.

4

Проверяйте Origin / Referer

Для чувствительных действий убедитесь, что Origin запроса — ваш собственный сайт, и отклоняйте внешние источники.

Мнение этого сайта: в основном «решено», но не расслабляйтесь

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

Частые пробелы

Даже зная механизм, реализации обычно проскальзывают в двух местах.

  • GET с побочными эффектами: если просматривающий GET меняет состояние, для CSRF достаточно тега изображения или обычной ссылки. Делайте изменения состояния через POST/PUT/DELETE и пропускайте их через проверку токена.
  • Забытая проверка токена на части путей: API и админ-функции, добавленные позже, часто пропускают токен. Не считайте, что «во фреймворке это есть» — один раз проинвентаризируйте каждый путь, меняющий состояние.

CSRF, XSS и SSRF

Эти три похожих названия различаются тем, кто отправляет запрос и на что опирается атака.

АтакаКто отправляет запросЧем злоупотребляютОсновная защита
CSRFБраузер пользователя без его ведомаАвтоматическое прикрепление кук браузеромCSRF-токены, куки SameSite
XSSСкрипт атакующего, выполняющийся в браузере пользователяОтсутствие экранирования при выводе страницыЭкранирование на выводе, CSP
SSRFВаш серверФункция, загружающая переданный ей URLСписок разрешённых адресатов, блокировка внутренних адресов

CSRF и XSS оба работают через браузер пользователя. Но если на странице есть XSS, скрипт внутри неё может прочитать CSRF-токен, и защита от CSRF обходится. Защита от CSRF исходит из того, что XSS уже устранён.

Реальный пример: поддельная публикация, принятая за действие пользователя

В 2012 году через форму для мнений на сайте мэрии Иокогамы была опубликована угроза напасть на начальные школы. Владелец компьютера, с которого она будто бы пришла, был арестован, а позже выяснилось, что арест был ошибкой. В декабре того же года полиция Токио, по сообщениям японской прессы, объяснила, что публикация была отправлена с помощью CSRF: браузер посетителя заставили отправить её после того, как он открыл ссылку, размещённую на форуме.

Из этого следуют два урока.

  • Запрос CSRF выглядит точно так же, как собственный запрос пользователя: сервер видит только IP-адрес и куки пользователя. По одним логам нельзя понять, отправил ли пользователь запрос сам или его заставили.
  • Формы без входа тоже в зоне риска: та форма для мнений не требовала входа. Ставьте токен на любую отправку, которую вы не хотели бы, чтобы запускали другие (публикации, заявки, сообщения), — независимо от того, нужен ли вход.

CSRF по-прежнему распространённая слабость. В «CWE Top 25» MITRE (25 самых опасных слабостей ПО), опубликованном в декабре 2025 года, CSRF (CWE-352) занял третье место.

Как проверить свой сайт

1

Явно задайте SameSite для сеансовых кук

Проверьте атрибут SameSite сеансовой куки в инструментах разработчика браузера (Application → Cookies) или с помощью аудита сайта. Chrome и Edge считают куки без атрибута Lax, но Safari и Firefox по умолчанию так не делают. Не полагайтесь на поведение браузера по умолчанию; задайте SameSite=Lax или Strict сами.

2

Пересмотрите исключения из защиты CSRF

Проверьте, не отключена ли защита CSRF фреймворка для части маршрутов (csrf_exempt в Django, список исключений в Laravel, skip_forgery_protection в Rails и т. п.). Где для отключения есть причина — например, приём вебхуков, — защитите маршрут проверкой подписи.

3

Найдите GET-маршруты, меняющие состояние

Пройдитесь по списку маршрутов в поисках GET-маршрутов, которые удаляют, обновляют или выполняют выход. Переведите их на POST или аналог и пропускайте через проверку токена.

4

Добавьте ещё одну проверку для чувствительных действий

Для смены пароля или адреса почты, перевода денег или выдачи прав запрашивайте, помимо токена, текущий пароль или многофакторную аутентификацию. Даже если запрос подделан, его остановит подтверждение пользователем.

Источники (первичные)

  • OWASP, «Cross-Site Request Forgery Prevention Cheat Sheet» — cheatsheetseries.owasp.org (токены, Sec-Fetch-Site, ограничения SameSite, обход защиты CSRF через XSS, никаких изменений состояния через GET)
  • MITRE, «2025 CWE Top 25 Most Dangerous Software Weaknesses» (декабрь 2025 г.) — cwe.mitre.org (CWE-352 на третьем месте)
  • web.dev, «SameSite cookies explained» — web.dev (какие браузеры считают куки без атрибута Lax)
  • INTERNET Watch, материал о деле с вредоносным ПО для удалённого управления (14 декабря 2012 г., на японском) — internet.watch.impress.co.jp (объяснение полиции, что для публикации в Иокогаме использовался CSRF)
  • @IT, статья об ошибочных арестах из-за вредоносного ПО для выдачи себя за другого и CSRF (ноябрь 2012 г., на японском) — atmarkit.itmedia.co.jp
  • IPA, «How to Secure Your Web Site» — ipa.go.jp (на японском)

Читать дальше

Классификация

CWE классифицирует типы слабостей, из-за которых возникают уязвимости; MITRE ATT&CK классифицирует техники атакующих. Обе системы ведёт MITRE, и они широко используются для разметки уязвимостей и правил обнаружения.

CWE (тип слабости)

CWE™: Copyright © 2006–2026, The MITRE Corporation. CWE is a trademark of The MITRE Corporation. The MITRE Corporation hereby grants you a non-exclusive, royalty-free license to use CWE for research, development, and commercial purposes. Any copy you make for such purposes is authorized on the condition that you reproduce MITRE’s copyright designation and this license in any such copy. CWE Terms of Use

FAQ

QЧем CSRF отличается от XSS?
A

XSS выполняет скрипт в браузере жертвы; CSRF использует активный сеанс жертвы, чтобы отправить непреднамеренный запрос. CSRF работает даже без выполнения какого-либо скрипта — просто за счёт того, что браузер автоматически отправляет куки.

QКакая защита от CSRF главная?
A

Требовать CSRF-токен на запросах, меняющих состояние (POST и т. п.), и устанавливать SameSite (Lax/Strict) на сеансовых куках. Большинство фреймворков поставляют токен по умолчанию. И ещё: никогда не используйте GET для изменений состояния.

QДостаточно ли одного SameSite?
A

Он сильно помогает, но сам по себе не даёт полной защиты. Остаются пробелы на старых браузерах, при некоторых переходах и в части настроек с поддоменами — поэтому сочетайте его с CSRF-токенами для эшелонированной защиты.

QНужна ли защита от CSRF формам, для которых не нужен вход?
A

Иногда да. Даже форму обратной связи или публикации можно отправить с другого сайта через браузер посетителя, и сервер запишет IP-адрес этого посетителя как отправителя. В Японии в 2012 году угроза, опубликованная на сайте мэрии Иокогамы, была отправлена через CSRF, и владелец компьютера, с которого она будто бы пришла, был ошибочно арестован. Ставьте токен на любую форму, которую вы не хотели бы, чтобы кто-то отправлял от имени посетителя, — независимо от того, нужен ли вход.

QНужна ли защита от CSRF JSON API с аутентификацией по Bearer-токенам?
A

Зависит от того, используются ли для аутентификации куки. CSRF опирается на то, что браузер прикрепляет куки автоматически. API, которое принимает только учётные данные, добавляемые самим приложением, например Bearer-токен в заголовке Authorization, как правило, не подвержено CSRF: другой сайт не может заставить браузер его добавить. Если API аутентифицирует по кукам, ему нужны токены или проверка Origin.

QЧто такое Sec-Fetch-Site и может ли он остановить CSRF?
A

Это заголовок запроса, который браузер добавляет, чтобы сообщить, пришёл ли запрос с того же источника или сайта (same-origin / same-site) или с другого сайта (cross-site). Руководство OWASP по CSRF называет одной из мер защиты отклонение межсайтовых запросов, меняющих состояние, на основе этого заголовка. Старые браузеры его не отправляют, поэтому оставьте проверку Origin как запасной вариант.