Ответ
CSRF (Cross-Site Request Forgery) токен — это уникальный, секретный и непредсказуемый ключ, генерируемый сервером и передаваемый клиенту для защиты от атак подделки межсайтовых запросов. Он гарантирует, что запросы, изменяющие состояние на сервере (например, POST, PUT, DELETE), исходят от легитимного пользователя через доверенный источник (например, форму на вашем сайте), а не от вредоносного сайта.
Почему он необходим? Без CSRF-токена злоумышленник может создать вредоносную страницу, которая отправляет запрос на ваш сайт от имени пользователя, если тот уже аутентифицирован. Браузер автоматически прикрепит куки сессии, и сервер выполнит действие, не подозревая о подделке. Токен предотвращает это, так как вредоносный сайт не может получить или угадать правильный токен.
Принцип работы:
- Сервер генерирует уникальный токен при загрузке формы или страницы.
- Токен встраивается в форму (как скрытое поле) или передается в HTTP-заголовке (например,
X-CSRF-Token
). - При отправке формы или AJAX-запроса клиент отправляет токен обратно на сервер.
- Сервер проверяет соответствие полученного токена ожидаемому (хранящемуся в сессии пользователя). Если они не совпадают, запрос отклоняется.
Пример реализации в Django:
<!-- В шаблоне Django автоматически вставит CSRF-токен в скрытое поле -->
<form method="post">
{% csrf_token %}
<input type="text" name="username">
<button type="submit">Submit</button>
</form>
# В представлении Django проверит токен автоматически при использовании @csrf_protect или CsrfViewMiddleware
from django.views.decorators.csrf import csrf_protect
from django.shortcuts import render, redirect
@csrf_protect
def my_view(request):
if request.method == 'POST':
# Логика обработки формы, если CSRF-токен валиден
return redirect('success_page')
return render(request, 'my_form.html')
Ключевые особенности:
- Уникальность: Генерируется для каждой сессии или формы.
- Проверка: Сервер проверяет токен при запросах, изменяющих состояние (POST, PUT, DELETE).
- Хранение: Обычно хранится в куках сессии на стороне клиента и в скрытом поле формы.
- Защита: Предотвращает выполнение несанкционированных действий от имени пользователя.