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 — про выполнение скрипта; это разные угрозы.