Для защиты веб-приложений от атак типа CSRF в Django используется встроенный механизм CSRF-токенов. Эти токены гарантируют, что запросы, отправленные на сервер, исходят от авторизованного пользователя, а не от злоумышленника. Чтобы включить защиту, добавьте тег {% csrf_token %} в каждую форму вашего шаблона. Это автоматически сгенерирует скрытое поле с уникальным токеном, который проверяется на сервере при обработке запроса.
Если вы работаете с AJAX-запросами, передавайте токен в заголовке X-CSRFToken. Получите его значение из куки csrftoken с помощью JavaScript и добавьте в каждый запрос. Например, используйте document.cookie для извлечения токена и настройте заголовок в вашем AJAX-вызове. Это обеспечит безопасность даже для динамически отправляемых данных.
Для отключения CSRF-защиты в отдельных представлениях используйте декоратор @csrf_exempt. Это может быть полезно, например, для API, где токены не требуются. Однако применяйте его с осторожностью, чтобы не оставить уязвимости в вашем приложении.
Проверяйте корректность работы CSRF-защиты на каждом этапе разработки. Используйте инструменты, такие как Django Debug Toolbar, чтобы убедиться, что токены генерируются и проверяются правильно. Это поможет избежать ошибок, которые могут привести к уязвимостям.
Настройка CSRF в Django: пошаговый процесс
Включите CSRF-защиту в вашем проекте, добавив 'django.middleware.csrf.CsrfViewMiddleware' в MIDDLEWARE в файле settings.py. Это активирует проверку токенов для всех POST-запросов.
Для форм, отправляющих данные через POST, используйте шаблонный тег {% csrf_token %} внутри тега <form>. Это автоматически добавит скрытое поле с CSRF-токеном.
Если вы работаете с AJAX, передавайте токен в заголовке запроса. Получите токен из куки с помощью csrftoken и добавьте его в заголовок X-CSRFToken. Например, в JavaScript это может выглядеть так:
const csrftoken = document.cookie.match(/csrftoken=([^;]+)/)[1];
fetch('/your-endpoint/', {
method: 'POST',
headers: {
'X-CSRFToken': csrftoken,
'Content-Type': 'application/json'
},
body: JSON.stringify({ key: 'value' })
});
Для исключения определённых представлений из проверки CSRF используйте декоратор @csrf_exempt. Например:
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def your_view(request):
# Ваш код
Настройте параметр CSRF_COOKIE_SECURE в settings.py на True, если ваш сайт использует HTTPS. Это гарантирует, что CSRF-куки передаются только через защищённые соединения.
Используйте CSRF_TRUSTED_ORIGINS для указания доверенных источников, если ваш сайт обрабатывает запросы с разных доменов. Например:
CSRF_TRUSTED_ORIGINS = ['https://yourdomain.com']
Проверяйте работу CSRF-защиты в тестовой среде перед развёртыванием на продакшн. Это поможет избежать ошибок, связанных с токенами.
Включение защиты CSRF в настройках проекта
Активируйте CSRF-защиту в Django, добавив 'django.middleware.csrf.CsrfViewMiddleware' в список MIDDLEWARE в файле settings.py. Этот промежуточный слой включен по умолчанию в новых проектах, но убедитесь, что он присутствует и не закомментирован.
- Проверьте, что
MIDDLEWAREсодержит строку'django.middleware.csrf.CsrfViewMiddleware'. - Если вы отключили его ранее, верните его в список, чтобы восстановить защиту.
Для корректной работы CSRF-токенов убедитесь, что в шаблонах используется тег {% csrf_token %} внутри форм. Это автоматически добавляет скрытое поле с токеном, который проверяется при отправке данных.
- Вставьте
{% csrf_token %}внутри тега<form>в ваших HTML-шаблонах. - Проверьте, что все формы, отправляющие данные методом POST, включают этот токен.
Если вы используете AJAX-запросы, добавьте CSRF-токен в заголовки запроса. Django предоставляет удобный способ для этого:
- Включите токен в заголовок
X-CSRFTokenдля AJAX-запросов. - Используйте JavaScript для извлечения токена из куки и передачи его в запросе.
Для тестирования или отладки можно временно отключить CSRF-защиту, удалив промежуточный слой из MIDDLEWARE. Однако не забывайте включать его обратно перед запуском проекта в продакшн.
Добавление CSRF-токена в формы
Для защиты форм от CSRF-атак в Django используйте тег {% csrf_token %}. Вставьте его внутрь тега <form> в вашем HTML-шаблоне. Этот тег автоматически генерирует скрытое поле с уникальным токеном, который проверяется на стороне сервера при отправке формы.
Пример использования:
<form method="post">
{% csrf_token %}
<input type="text" name="username">
<button type="submit">Отправить</button>
</form>
Если вы работаете с AJAX-запросами, передавайте токен в заголовке X-CSRFToken. Получите токен из cookies с помощью JavaScript:
const csrftoken = document.querySelector('[name=csrfmiddlewaretoken]').value;
fetch('/your-endpoint/', {
method: 'POST',
headers: {
'X-CSRFToken': csrftoken,
'Content-Type': 'application/json'
},
body: JSON.stringify({ data: 'example' })
});
Для обработки форм в классах представлений Django используйте встроенные миксины, такие как CsrfViewMiddleware, который включен по умолчанию. Это гарантирует, что токен будет проверен автоматически.
Если вы создаете формы вручную, добавьте токен вручную:
from django.middleware.csrf import get_token csrf_token = get_token(request)
Проверяйте токен на стороне сервера с помощью декоратора @csrf_protect, если вы отключили middleware или работаете с нестандартными запросами.
Настройка Middleware для CSRF
Для работы с CSRF-токенами в Django активируйте встроенный middleware django.middleware.csrf.CsrfViewMiddleware. Он уже включен в список MIDDLEWARE по умолчанию в файле settings.py. Если его нет, добавьте его вручную:
MIDDLEWARE = [
# Другие middleware
'django.middleware.csrf.CsrfViewMiddleware',
# Другие middleware
]
Этот middleware выполняет несколько задач:
- Генерирует уникальный CSRF-токен для каждого запроса.
- Проверяет токен при отправке POST, PUT, DELETE и других небезопасных HTTP-методов.
- Добавляет токен в формы через шаблонный тег
{% csrf_token %}.
Для исключения определенных представлений из проверки CSRF используйте декоратор @csrf_exempt. Например:
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def my_view(request):
# Логика представления
Если вы хотите добавить CSRF-защиту только к конкретным представлениям, используйте декоратор @csrf_protect:
from django.views.decorators.csrf import csrf_protect
@csrf_protect
def my_view(request):
# Логика представления
Для работы с AJAX-запросами передавайте CSRF-токен в заголовке X-CSRFToken. Получите токен из cookie csrftoken и добавьте его в запрос:
const csrftoken = document.cookie.match(/csrftoken=([^ ;]+)/)[1];
fetch('/my-endpoint/', {
method: 'POST',
headers: {
'X-CSRFToken': csrftoken,
'Content-Type': 'application/json'
},
body: JSON.stringify({ data: 'example' })
});
Проверьте, что ваш проект использует HTTPS, чтобы защитить CSRF-токены от перехвата. Настройте параметр CSRF_COOKIE_SECURE в settings.py:
CSRF_COOKIE_SECURE = True
Для улучшения безопасности измените имя CSRF-куки, добавив в settings.py:
CSRF_COOKIE_NAME = 'my_custom_csrf_cookie_name'
Эти шаги помогут настроить CSRF-защиту в Django и минимизировать риски атак.
Проверка и обработка CSRF-токенов в представлениях
Для проверки CSRF-токена в Django используйте декоратор @csrf_protect. Этот декоратор гарантирует, что запросы, поступающие к вашему представлению, содержат корректный токен. Например:
from django.views.decorators.csrf import csrf_protect
@csrf_protect
def my_view(request):
# Ваш код обработки запроса
Если токен отсутствует или неверен, Django автоматически вернет ошибку 403. Это предотвращает выполнение неавторизованных запросов.
Для обработки POST-запросов добавьте токен в форму с помощью шаблонного тега {% csrf_token %}. Это гарантирует, что токен будет включен в данные формы:
<form method="post">
{% csrf_token %}
<!-- Поля формы -->
<button type="submit">Отправить</button>
</form>
Если вы работаете с AJAX-запросами, передавайте токен в заголовке X-CSRFToken. Получите токен из куки csrftoken и добавьте его в запрос:
const csrftoken = document.cookie.match(/csrftoken=([^;]+)/)[1];
fetch('/your-endpoint/', {
method: 'POST',
headers: {
'X-CSRFToken': csrftoken,
'Content-Type': 'application/json'
},
body: JSON.stringify({ key: 'value' })
});
Для отключения проверки CSRF в отдельных представлениях используйте декоратор @csrf_exempt. Это полезно для API, где токены не требуются:
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def my_api_view(request):
# Ваш код обработки запроса
Проверяйте и обрабатывайте CSRF-токены в каждом представлении, где это необходимо, чтобы обеспечить безопасность вашего приложения.
Как Django обрабатывает CSRF-токены
Django автоматически добавляет CSRF-токен в каждую форму, созданную с использованием шаблонного тега {% csrf_token %}. При отправке формы сервер проверяет наличие токена и его корректность, чтобы убедиться, что запрос исходит от доверенного источника. Если токен отсутствует или не совпадает, Django возвращает ошибку 403 Forbidden.
Для обработки AJAX-запросов можно передать токен через заголовок X-CSRFToken. Используйте JavaScript, чтобы извлечь токен из cookie с именем csrftoken и добавить его в заголовок запроса. Это позволяет Django проверить подлинность запроса без использования формы.
В настройках проекта можно изменить поведение CSRF-защиты. Например, отключить проверку для определенных представлений с помощью декоратора @csrf_exempt. Однако это снижает уровень безопасности, поэтому применяйте его с осторожностью.
Django также поддерживает CSRF-токены для сессий. Если пользователь авторизован, токен привязывается к его сессии, что предотвращает подделку запросов между разными аккаунтами. Это особенно полезно для защиты от атак, направленных на перехват сессий.
Для повышения безопасности рекомендуется использовать HTTPS вместе с CSRF-токенами. Это предотвращает перехват токенов при передаче данных между клиентом и сервером.
Устранение ошибок, связанных с CSRF
Если вы столкнулись с ошибкой CSRF verification failed, убедитесь, что форма отправляется с включенным CSRF-токеном. Добавьте тег {% csrf_token %} внутри формы в шаблоне. Это автоматически вставит скрытое поле с токеном.
Для AJAX-запросов передавайте токен через заголовок X-CSRFToken. Получите токен из куки csrftoken с помощью JavaScript и включите его в запрос. Пример:
const csrftoken = document.querySelector('[name=csrfmiddlewaretoken]').value;
fetch('/your-endpoint/', {
method: 'POST',
headers: {
'X-CSRFToken': csrftoken,
},
body: JSON.stringify({ data: 'your data' })
});
Если токен отсутствует в куках, проверьте настройки CSRF_COOKIE_SECURE и CSRF_COOKIE_HTTPONLY в settings.py. Убедитесь, что они корректно настроены для вашего окружения.
Для исключения конкретных представлений из проверки CSRF используйте декоратор @csrf_exempt. Например:
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def your_view(request):
# Ваш код
Если ошибка возникает при работе с API, убедитесь, что клиент передает токен корректно. Для REST API можно использовать библиотеку django-rest-framework, которая поддерживает CSRF-защиту.
Проверьте, что время жизни токена не истекло. По умолчанию токен действителен в течение сессии. Если сессия завершена, обновите страницу для получения нового токена.
Для отладки включите логирование CSRF-ошибок. Добавьте в settings.py:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django.security.csrf': {
'handlers': ['console'],
'level': 'DEBUG',
},
},
}
Если проблема сохраняется, проверьте, что промежуточное ПО CsrfViewMiddleware включено в MIDDLEWARE в settings.py. Без него CSRF-защита не работает.
Использование CSRF токенов в AJAX-запросах
Для работы с CSRF-токенами в AJAX-запросах в Django, добавьте токен в заголовки запроса. Это можно сделать, извлекая токен из куки и передавая его в заголовке X-CSRFToken.
Сначала убедитесь, что CSRF-токен включен в шаблон. Django автоматически добавляет его в форму, если используется тег {% csrf_token %}. Для AJAX-запросов токен можно получить из куки с помощью JavaScript:
function getCookie(name) {
let cookieValue = null;
if (document.cookie && document.cookie !== '') {
const cookies = document.cookie.split(';');
for (let i = 0; i < cookies.length; i++) {
const cookie = cookies[i].trim();
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
const csrftoken = getCookie('csrftoken');
После получения токена, добавьте его в заголовок запроса. Например, при использовании Fetch API:
fetch('/your-endpoint/', {
method: 'POST',
headers: {
'X-CSRFToken': csrftoken,
'Content-Type': 'application/json'
},
body: JSON.stringify({ key: 'value' })
});
Если вы используете jQuery, настройте AJAX-запросы для автоматической передачи токена:
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
Этот подход гарантирует, что каждый AJAX-запрос будет защищен от CSRF-атак. Убедитесь, что ваш сервер корректно проверяет заголовок X-CSRFToken.
| Метод | Описание |
|---|---|
| Fetch API | Используйте заголовок X-CSRFToken для передачи токена. |
| jQuery | Настройте $.ajaxSetup для автоматической передачи токена. |
Проверяйте корректность токена на сервере, чтобы избежать уязвимостей. Django автоматически проверяет CSRF-токен, если он передан в заголовке или теле запроса.
Идентификация возможных уязвимостей
Проверяйте, все ли формы на сайте используют CSRF-токены. Отсутствие токенов в POST-запросах делает приложение уязвимым для атак. В Django токены автоматически добавляются в формы через тег {% csrf_token %}, но их можно случайно удалить при ручном редактировании шаблонов.
Убедитесь, что CSRF-защита включена для всех представлений, которые обрабатывают POST-запросы. Проверьте настройки в settings.py: параметр CSRF_USE_SESSIONS должен быть активирован, если вы хотите хранить токены в сессиях, а не в cookies.
Тестируйте обработку исключений CSRF. Если приложение возвращает ошибку 403 при отсутствии токена, это указывает на корректную работу защиты. Однако, если ошибка не возникает, проверьте, не отключена ли CSRF-защита для конкретного представления с помощью декоратора @csrf_exempt.
Анализируйте логи сервера на наличие подозрительных запросов. Частые POST-запросы без CSRF-токенов могут свидетельствовать о попытках атаки. Используйте инструменты, такие как Django Debug Toolbar, для мониторинга запросов и их параметров.
Проверьте, как приложение обрабатывает токены в AJAX-запросах. Для таких запросов токен должен передаваться в заголовке X-CSRFToken. Убедитесь, что ваш JavaScript корректно извлекает токен из cookies и добавляет его в запросы.
Регулярно обновляйте Django до последней версии. Новые релизы часто включают исправления уязвимостей, связанных с CSRF. Устаревшие версии фреймворка могут содержать известные проблемы, которые уже устранены в более новых версиях.






