CSRF и защита токенами

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

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

В чём механизм

Браузер автоматически прикладывает cookie сайта к каждому запросу на этот сайт — независимо от того, кто запрос инициировал. Если вы залогинены в банке и одновременно открыли вредоносную страницу, эта страница может «попросить» браузер отправить запрос в банк. Браузер приложит вашу cookie сессии, и для банка запрос будет выглядеть как ваш. Так чужой сайт «подделывает» действие от вашего имени.

Важно: CSRF не крадёт данные напрямую и не читает ответ — он лишь провоцирует действие (перевод, смена email, удаление). Поэтому особенно опасны запросы, которые что-то меняют.

Защита 1: CSRF-токен

Идея: сервер встраивает в форму секретный непредсказуемый токен, уникальный для сессии. При отправке формы токен возвращается, и сервер проверяет его. Чужой сайт этот токен не знает (он не может прочитать содержимое вашей страницы на другом домене), поэтому подделать запрос не сможет.

import secrets, hmac

# Сервер выдаёт токен и кладёт его в сессию и в форму
csrf_token = secrets.token_hex(16)

# При получении формы сравниваем безопасно, защищаясь от тайминг-атак
from_form = csrf_token            # пришло из формы
in_session = csrf_token           # хранится на сервере

valid = hmac.compare_digest(from_form, in_session)
print("Токен совпал, запрос легитимен:", valid)

# Запрос с чужого сайта не знает токен
forged = "00000000000000000000000000000000"
print("Подделанный запрос принят:", hmac.compare_digest(forged, in_session))

Вывод:

Токен совпал, запрос легитимен: True
Подделанный запрос принят: False

Чужой сайт не может угадать токен, поэтому его поддельный запрос отклоняется.

Защита 2: cookie SameSite

Атрибут SameSite у cookie говорит браузеру не прикладывать её к запросам, инициированным с другого сайта. Со значением SameSite=Lax или Strict cookie сессии не уйдёт по запросу с вредоносной страницы, и CSRF попросту не сработает. Это сильная защита «из коробки», которую современные браузеры применяют по умолчанию.

Почему важны оба подхода

МеханизмЧто делает
CSRF-токенсервер проверяет секрет, известный только своей странице
SameSite-cookieбраузер не шлёт cookie на межсайтовые запросы
Проверка методаизменяющие действия только через POST/PUT/DELETE, не через GET

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

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

Их легко перепутать. XSS — выполнение чужого скрипта на вашей странице (проблема вывода). CSRF — подделка запроса с использованием ваших cookie (проблема доверия источнику запроса). Разные причины — разные средства защиты.

Итог

  • CSRF использует автоматическую отправку cookie, чтобы выполнить действие от имени жертвы.
  • CSRF-токен — секрет, который чужой сайт не знает; проверяйте его на изменяющих запросах.
  • SameSite-cookie не даёт браузеру слать cookie на межсайтовые запросы.
  • CSRF — про подделку запроса, XSS — про выполнение скрипта; это разные угрозы.
Проверьте себя
1. Что использует атака CSRF?
AСлабый пароль пользователя
BАвтоматическую отправку браузером cookie на сайт независимо от инициатора запроса
CУязвимость шифрования
DОшибку в базе данных
2. Как CSRF-токен защищает от атаки?
AШифрует cookie
BСодержит секрет, известный только настоящей странице, который чужой сайт не может угадать
CУдлиняет сессию
DСкрывает URL формы
3. Что делает атрибут cookie SameSite?
AШифрует содержимое cookie
BЗапрещает браузеру слать cookie на запросы, инициированные с другого сайта
CДелает cookie вечной
DУскоряет запросы
4. Чем CSRF отличается от XSS?
AЭто одно и то же
BCSRF подделывает запрос с вашими cookie, XSS выполняет чужой скрипт на странице
CCSRF опаснее всегда
DXSS работает только в банках
Поддержать проект