Для чего используется CSRF-токен

Ответ

CSRF-токен (Cross-Site Request Forgery, подделка межсайтовых запросов) используется для защиты веб-приложений от атак типа CSRF. Эти атаки позволяют злоумышленнику заставить аутентифицированного пользователя выполнить нежелательные действия на сайте, используя его текущую сессию.

Как это работает:

  1. Сервер генерирует уникальный, непредсказуемый токен для каждой пользовательской сессии или формы.
  2. Этот токен встраивается в скрытое поле HTML-формы или в заголовок запроса (например, X-CSRF-Token).
  3. При отправке формы или запроса, сервер проверяет соответствие полученного токена тому, который был выдан для текущей сессии.

Почему это важно: Браузеры автоматически отправляют куки (включая сессионные) с каждым запросом к домену. Без CSRF-токена, вредоносный сайт может создать форму, которая отправляет запрос на ваш сайт, и браузер пользователя автоматически прикрепит его сессионные куки, делая запрос легитимным для сервера. Токен предотвращает это, так как злоумышленник не может получить или предсказать правильный токен.

Пример (Django): В Django CSRF-защита встроена. Токен автоматически добавляется в формы и проверяется для POST-запросов.

<!-- В шаблоне: {% csrf_token %} добавляет скрытое поле с токеном -->
<form method="post">
    {% csrf_token %}
    <input type="text" name="data">
    <button type="submit">Отправить</button>
</form>
# В представлении (view): Django автоматически проверяет токен для POST-запросов
from django.views.decorators.csrf import csrf_protect
from django.shortcuts import render

@csrf_protect
def my_protected_view(request):
    if request.method == 'POST':
        # Если токен невалиден, Django выдаст ошибку 403 Forbidden
        # ... обработка POST-запроса ...
        pass
    return render(request, 'my_template.html')

Ключевые характеристики:

  • Уникальность: Токен уникален для каждой сессии или формы.
  • Непредсказуемость: Должен быть криптографически сильным и непредсказуемым.
  • Проверка: Сервер проверяет токен при каждом запросе, изменяющем состояние (POST, PUT, DELETE).
  • Защита: Предотвращает подделку запросов, инициированных с других сайтов.