Зачем нужен CSRF токен в Django и что это такое?

CSRF токен в Django - это механизм защиты от подделки межсайтовых запросов (CSRF). Он используется для предотвращения атак, в которых злоумышленник отправляет запросы от имени пользователя без его согласия или знания.

Когда пользователь взаимодействует с веб-страницей, содержащей форму, Django автоматически генерирует уникальный CSRF токен и включает его в форму. При отправке формы сервер проверяет, что CSRF токен соответствует ожидаемому значению, что подтверждает, что запрос действительно был сделан пользователем, а не злоумышленником.

Вот пример использования CSRF токена в Django:

from django.views.decorators.csrf import csrf_protect
from django.template import RequestContext

@csrf_protect
def my_view(request):
    # Ваш код обработки запроса
    context = RequestContext(request)
    # Втавляем CSRF токен в контекст
    context['csrf_token'] = request.COOKIES['csrftoken']
    return render(request, 'my_template.html', context)

Детальный ответ

CSRF токен в Django: что это?

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

CSRF-атака возникает, когда злоумышленник отправляет запросы с другого сайта от имени аутентифицированного пользователя. Например, если пользователь аутентифицирован в своем аккаунте на одном сайте и посещает злонамеренный сайт, который отправляет запросы на сайт пользователя, используя сохраненные куки. Если сайт не защищен от CSRF-атак, эти запросы будут выполнены, и злоумышленник сможет выполнить действия от имени пользователя без его согласия.

В Django CSRF-токен предотвращает подобные атаки. Все POST запросы, изменяющие состояние сервера, должны содержать CSRF-токен, иначе они будут отклонены. Для этого Django предлагает несколько способов работы с CSRF-токеном.

Использование CSRF-токена в Django

В Django CSRF-токен автоматически генерируется и отправляется с помощью шаблонного тега. Чтобы использовать CSRF-токен в форме на вашей веб-странице, вам просто необходимо добавить тег {% csrf_token %} внутри блока <form>.


  <form method="post" action=".">
    {% csrf_token %}
    <input type="text" name="name" />
    <input type="submit" value="Submit" />
  </form>
  

Когда форма отправляется, Django автоматически проверяет наличие и валидность CSRF-токена. Если токен отсутствует или недействителен, Django вернет ошибку 403 Forbidden и запрос будет отклонен.

Другие способы работы с CSRF-токеном

В Django также доступны другие способы работы с CSRF-токеном:

  • Использование декоратора @csrf_protect для защиты от CSRF-атак во всех представлениях сайта.
  • Использование @csrf_exempt для исключения определенных представлений из защиты CSRF.
  • Использование функции get_token() для получения CSRF-токена в представлении.
  • Использование функций {% csrf_token %} и {% csrf_input %} в шаблонах для получения токена и вставки его в формы и запросы AJAX.
  • Использование @ensure_csrf_cookie для установки CSRF-токена в куки.

Проверка наличия CSRF-токена в AJAX-запросах

Если вы выполняете AJAX-запросы на свой сервер, убедитесь, что вы отправляете CSRF-токен в заголовках запроса. В противном случае, запрос будет отклонен. Ниже приведен пример использования JQuery для отправки AJAX-запроса с CSRF-токеном:


  $.ajax({
    url: '/your-url/',
    type: 'POST',
    headers: {
      'X-CSRFToken': '{{ csrf_token }}'
    },
    data: {
      'param1': 'value1',
      'param2': 'value2'
    },
    success: function(response) {
      // Обработка успешного ответа
    },
    error: function(xhr, errmsg, err) {
      // Обработка ошибки
    }
  });
  

Заключение

CSRF-токен в Django является важной мерой защиты от CSRF-атак. Он гарантирует, что все POST запросы, изменяющие состояние сервера, являются подлинными и отправлены с доверенного источника. Использование CSRF-токена в Django обеспечивает безопасность веб-приложений и защищает пользователей от злоумышленников.

Видео по теме

CSRF (доска)

22. Подделываем межсайтовые запросы с CSRF уязвимостью.

12 CSRF атака Общее представление

Похожие статьи:

Зачем нужен CSRF токен в Django и что это такое?