CSRF-токен
Что такое CSRF-токен?
CSRF-токенНепредсказуемое значение, привязанное к сессии и встраиваемое в формы или заголовки, чтобы сервер мог убедиться, что изменяющие состояние запросы исходят с его страниц.
CSRF-токен — каноническая защита от Cross-Site Request Forgery, атаки, занимавшей место A05 в OWASP Top 10 2013 и включённой в категорию «Broken Access Control» в более поздних редакциях. Сервер генерирует криптографически случайное значение, связывает его с сессией пользователя и встраивает в HTML-формы или предоставляет для пользовательского заголовка запроса. Поскольку политика единого источника (same-origin policy) не позволяет странице атакующего прочитать токен, поддельный межсайтовый запрос не может передать корректное значение и отклоняется.
Преобладают три схемы. Synchronizer token pattern хранит ожидаемое значение на стороне сервера — самая надёжная, но требует состояния. Double-submit cookies сравнивают cookie с совпадающим полем формы или заголовком, не нуждаясь в серверном состоянии, но уязвимы, если атакующий может записывать cookie через поддомен. Подписанный (HMAC) double-submit привязывает токен к сессии, закрывая этот пробел. Токены должны быть привязаны к сессии (или к запросу для чувствительных действий), достаточно длинными и сравниваться за константное время.
Важна эшелонированная защита: начиная с Chrome 80 (февраль 2020 года) непомеченные cookie по умолчанию получают SameSite=Lax, что блокирует большинство межсайтовых POST-запросов, но Lax всё ещё допускает GET-навигации верхнего уровня, и не каждый браузер его применяет — поэтому токены остаются необходимыми. Сочетайте их с проверкой Origin/Referer и строгим CORS. API с bearer-токенами, вызываемые только из JavaScript, не используют неявные cookie и, как правило, не нуждаются в CSRF-токене, но всё же требуют защиты от повторного воспроизведения и контроля авторизации.
flowchart TD
A[Пользователь загружает форму] --> B[Сервер выдаёт CSRF-токен, привязанный к сессии]
B --> C[Токен в скрытом поле или заголовке]
C --> D[Пользователь отправляет изменяющий состояние запрос]
D --> E{Токен совпадает со значением сессии?}
E -- Да --> F[Обработать запрос]
E -- Нет или отсутствует --> G[Отклонить 403 - поддельный запрос]
H[Межсайтовая форма атакующего] -. не может прочитать токен .-> G● Примеры
- 01
Скрытое поле <input type="hidden" name="csrf" value="a8f1..."> в форме.
- 02
Заголовок X-CSRF-Token, проверяемый на сервере против секрета сессии.
● Частые вопросы
Что такое CSRF-токен?
Непредсказуемое значение, привязанное к сессии и встраиваемое в формы или заголовки, чтобы сервер мог убедиться, что изменяющие состояние запросы исходят с его страниц. Относится к категории Идентификация и доступ в кибербезопасности.
Что означает CSRF-токен?
Непредсказуемое значение, привязанное к сессии и встраиваемое в формы или заголовки, чтобы сервер мог убедиться, что изменяющие состояние запросы исходят с его страниц.
Как защититься от CSRF-токен?
Защита от CSRF-токен обычно сочетает технические меры и операционные практики, как описано в определении выше.