Как CsrfViewMiddleware в Django защищает от CSRF-атак

Ответ

CsrfViewMiddleware — это встроенный в Django механизм защиты от атак типа "Межсайтовая подделка запроса" (Cross-Site Request Forgery). Атака заключается в том, что злоумышленник заставляет браузер аутентифицированного пользователя выполнить нежелательное действие на вашем сайте.

Механизм защиты (по шагам):

  1. Генерация токена: Для каждой пользовательской сессии Django генерирует уникальный секретный токен (csrf_token).
  2. Передача токена клиенту: Этот токен отправляется клиенту в виде cookie с именем csrftoken.
  3. Встраивание в формы: При рендеринге HTML-форм тег {% csrf_token %} добавляет в форму скрытое поле <input type='hidden' name='csrfmiddlewaretoken' value='...'> с этим же токеном.
  4. Проверка на сервере: При получении "небезопасного" запроса (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-фреймворков имеют для этого встроенные решения.