Ответ
CsrfViewMiddleware — это встроенный в Django механизм защиты от атак типа "Межсайтовая подделка запроса" (Cross-Site Request Forgery). Атака заключается в том, что злоумышленник заставляет браузер аутентифицированного пользователя выполнить нежелательное действие на вашем сайте.
Механизм защиты (по шагам):
- Генерация токена: Для каждой пользовательской сессии Django генерирует уникальный секретный токен (
csrf_token). - Передача токена клиенту: Этот токен отправляется клиенту в виде cookie с именем
csrftoken. - Встраивание в формы: При рендеринге HTML-форм тег
{% csrf_token %}добавляет в форму скрытое поле<input type='hidden' name='csrfmiddlewaretoken' value='...'>с этим же токеном. - Проверка на сервере: При получении "небезопасного" запроса (POST, PUT, DELETE) middleware выполняет проверку:
- Извлекает токен из cookie.
- Извлекает токен из тела запроса (из скрытого поля).
- Если токены не совпадают или отсутствуют, запрос отклоняется с ошибкой 403 Forbidden.
Почему это работает?
Злоумышленник, разместив вредоносную форму на своем сайте, не имеет доступа к cookie вашего домена. Следовательно, он не может подставить в свой запрос правильный csrf_token, и атака проваливается.
Практическое применение:
-
Включение в
settings.py:MIDDLEWARE = [ # ... 'django.middleware.csrf.CsrfViewMiddleware', # ... ] -
Использование в шаблонах:
<form method="post"> {% csrf_token %} <!-- Поля формы --> <button type="submit">Отправить</button> </form>
AJAX-запросы:
Для AJAX-запросов токен необходимо вручную извлекать из cookie и передавать в заголовке X-CSRFToken. Большинство JavaScript-фреймворков имеют для этого встроенные решения.