Можете объяснить, что такое middleware, предохраняющее от межсайтовых запросов CSRF?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
CSRF-middleware — это защитный слой, который проверяет, что запрос действительно пришёл от пользователя с валидной сессией, а не с чужого сайта. Обычно он сравнивает CSRF-токен в cookie/сессии с токеном в форме или заголовке. Если токен не совпадает или отсутствует, запрос отклоняется.
Определение:
CSRF (Cross-Site Request Forgery) — это атака, при которой злоумышленник заставляет браузер пользователя отправить запрос на доверенный сайт, используя уже имеющуюся авторизацию пользователя. Middleware для защиты от CSRF проверяет специальный одноразовый или сессионный токен, чтобы убедиться, что запрос сформирован самим приложением, а не сторонним сайтом.
Обычно такая защита нужна для запросов, которые изменяют состояние: POST, PUT, PATCH, DELETE. Для безопасных GET-запросов её чаще не применяют.
Пример использования:
В веб-приложении есть форма изменения email. При рендеринге формы сервер добавляет CSRF-токен, а middleware проверяет его при отправке.
<form method="post" action="/profile/email">
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
<input type="email" name="email">
<button type="submit">Сохранить</button>
</form>
Если запрос приходит без правильного csrf_token, middleware возвращает ошибку, например 403 Forbidden.
Пояснение кода:
Код здесь показывает типичный принцип работы защиты:
- Сервер при формировании страницы выдаёт токен, связанный с текущей сессией пользователя.
- Токен вставляется в скрытое поле формы.
- При отправке формы браузер передаёт этот токен обратно на сервер.
- Middleware до выполнения бизнес-логики проверяет, совпадает ли токен с ожидаемым значением.
- Если токен отсутствует, просрочен или неверен, запрос не обрабатывается.
Отдельный код реализации middleware зависит от фреймворка: в Django, Flask, FastAPI или других решается по-разному, но общий принцип одинаковый.
Ключевые моменты:
- CSRF защищает от запросов, которые браузер может отправить автоматически от имени пользователя.
- Middleware проверяет наличие и корректность CSRF-токена.
- Защита особенно важна для изменяющих данные HTTP-методов.
- Токен обычно передаётся через скрытое поле формы или заголовок.
- При провале проверки сервер должен вернуть
403 Forbidden. - CSRF-защита не заменяет аутентификацию, а дополняет её.