Ответ
CSRF-токен (Cross-Site Request Forgery, подделка межсайтовых запросов) используется для защиты веб-приложений от атак типа CSRF. Эти атаки позволяют злоумышленнику заставить аутентифицированного пользователя выполнить нежелательные действия на сайте, используя его текущую сессию.
Как это работает:
- Сервер генерирует уникальный, непредсказуемый токен для каждой пользовательской сессии или формы.
- Этот токен встраивается в скрытое поле HTML-формы или в заголовок запроса (например,
X-CSRF-Token
). - При отправке формы или запроса, сервер проверяет соответствие полученного токена тому, который был выдан для текущей сессии.
Почему это важно: Браузеры автоматически отправляют куки (включая сессионные) с каждым запросом к домену. Без 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).
- Защита: Предотвращает подделку запросов, инициированных с других сайтов.