Защитите свой веб-сайт от очень распространенной дыры в безопасности с помощью встроенной в Django обработки CSRF.

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

Что такое токен CSRF?

Токен CSRF — это функция безопасности, которая защищает веб-приложения от Атаки с подделкой межсайтовых запросов (CSRF). Это позволяет серверу приложений проверить, была ли отправка формы из подлинного браузера или хакер подделал ее.

Токены CSRF — это входные данные формы, которые отслеживают сеанс пользователя. Веб-сайт каркас веб-приложений на стороне сервера обычно генерирует токены CSRF для каждого уникального сеанса пользователя. Сервер проверяет правильность токена всякий раз, когда пользователь отправляет форму. Токены CSRF обычно состоят из случайных строк и чисел, что делает их значения непредсказуемыми.

instagram viewer

Генерация токена CSRF в Django

Джанго получить_токен() функция случайным образом генерирует токены CSRF. Чтобы найти эту функцию, перейдите к csrf.py файл внутри вашего Виртуальная среда Python. Структура папок должна выглядеть так:

окр/

└── Либ/

└── сайт-пакеты/

└── Джанго/

└── промежуточное ПО/

└── csrf.py

Внутри этого файла вы найдете получить_токен() функция, которая возвращает токен. Джанго использует маскирование данных для защиты стоимости токена от хакеров.

По умолчанию Django включает защиту CSRF для вашего сайта, добавляя django.middleware.csrf. CsrfViewПромежуточное ПО в ПРОМЕЖУТОЧНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ список ваших settings.py файл. Все, что вам нужно сделать, это добавить {% csrf_token%} на ваш ПОЧТА формы. Без добавления {% csrf_token%}, вы получите 403 (запрещено) ошибка при отправке формы.

Когда вы добавляете {% csrf_token%} к вашей форме, он автоматически создает скрытое поле ввода с именем csrfmiddlewaretoken, который содержит значение замаскированного токена CSRF. Сервер использует это значение, чтобы определить, является ли отправка формы подлинной. Вы можете проверить значение этого скрытого поля, просмотрев исходный код страницы или используя функцию инструментов разработчика вашего браузера.

Как токены CSRF работают в Django

Когда вы запускаете свой сайт с формой, Django автоматически создает куки браузера называется csrftoken. Этот файл cookie отслеживает действия пользователей на сайте и однозначно идентифицирует каждого пользователя.

Когда пользователь отправляет форму, сервер сравнивает значение файла cookie со значением csrfmiddlewaretoken в скрытом поле ввода. Если эти значения совпадают, сервер обработает форму успешно, иначе выдаст ошибку.

На первый взгляд, значения cookie и csrfmiddlewaretoken кажутся разными. Это сделано намеренно и добавляет дополнительный уровень защиты к токену CSRF. Токен CSRF сравнивается с файлом cookie следующим образом:

  • получить_токен() Функция маскирует токен CSRF перед передачей его в поле ввода.
  • Когда форма отправляется, токен CSRF демаскируется с помощью секретного ключа в файле настроек.
  • Немаскированный токен сравнивается с файлом cookie сеанса.
  • Если значения совпадают, форма обрабатывается. Если нет, сервер возвращает ошибку.

Чтобы хакеры не украли ваш токен CSRF, Django обновляет его каждый раз, когда запускает пользовательский сеанс.

Создание пользовательских токенов CSRF

Хотя Django упрощает защиту ваших форм, просто добавляя {% csrf_token%}, также возможно создание токенов CSRF и добавление их в формы вручную. Для этого импортируйте получить_токен() функция:

от django.middleware.csrf Импортировать get_token

На ваш взгляд, вы можете сгенерировать токен CSRF следующим образом:

дефview_name(запрос):
csrf_token = get_token (запрос)

# выполняем логику представления
контекст = {
"csrf_токен": csrf_token
}

возвращаться оказывать (запрос, 'имя_приложения/template.html', контекст=контекст)

В свой HTML-шаблон вы можете вручную включить тег ввода и добавить csrf_token к этому так:

<формаметод="ПОЧТА" >
<входтип="скрытый"имя="csrfmiddlewaretoken"ценить="{{ csrf_token }}">
{{form.as_p}}
<кнопкатип="представлять на рассмотрение"сорт="btn btn-контур-вторичный">Добавить книгукнопка>
форма>

Кроме того, вы можете создать скрытое поле ввода из своих представлений следующим образом:

дефВаше мнение(запрос):
csrf_token = get_token (запрос)
csrf_token_html = ''.формат (csrf_token)

# выполняем логику представления
контекст = {
"csrf_токен": csrf_token_html
}

возвращаться оказывать (запрос, 'имя_приложения/template.html', контекст=контекст)

Затем вы можете добавить его в свой HTML-шаблон следующим образом:

<формаметод="ПОЧТА" >
{{ csrf_token_html|безопасно}}
{{form.as_p}}
<кнопкатип="представлять на рассмотрение"сорт="btn btn-контур-вторичный">Добавить книгукнопка>
форма>

Если вы хотите полностью контролировать защиту вашей формы от CSRF, вы можете сделать это, сравнив свой токен CSRF с файлом cookie, хранящимся в браузере. Основываясь на результатах сравнения, вы можете обрабатывать отправку формы так, как хотите. Вот пример:

от django.shortcuts Импортировать оказывать
от django.middleware.csrf Импортировать get_token, _unmask_cipher_token
от django.utils.crypto Импортировать Constant_time_compare

дефВаше мнение(запрос):
# Генерируем пользовательский токен CSRF
csrf_token = get_token (запрос)
csrf_cookie = запрос. COOKIES.получить('csrftoken')

# разоблачить токен csrf
unmasked_csrf_token = _unmask_cipher_token (csrf_token)

# Сравните токены
еслинет Constant_time_compare (unmasked_csrf_token, csrf_cookie):
# Обработать случай, когда токены не совпадают
проходить
еще:
# Обработать случай совпадения токенов
проходить

# Визуализировать шаблон
контекст = {
'csrf_token': csrf_токен,
}

возвращаться оказывать (запрос, 'имя_приложения/template.html', контекст=контекст)

Этот фрагмент кода извлекает csrf_cookie из объекта HTTP-запроса. Затем он использует _unmask_cipher_token() функция, позволяющая разоблачить csrf_token.

Условный оператор сравнивает полученные значения csrf_cookie и разоблаченный csrf_token. В этом сравнении используется Constant_time_compare Функция защиты от тайминг-эксплойтов. Вы можете написать свою логику на основе результата сравнения.

Отключение защиты CSRF в Django

Несмотря на то, что Django обеспечивает защиту от CSRF по умолчанию, вы можете отключить ее в своем проекте, если хотите. Есть два способа сделать это:

  • Отключение защиты CSRF на всем сайте.
  • Отключение защиты CSRF для определенного представления.

Отключение защиты CSRF на всем вашем сайте

Чтобы отключить защиту Django CSRF на вашем веб-сайте, вам просто нужно удалить промежуточное ПО CSRF из файла настроек. В файле настроек найдите список под названием ПРОМЕЖУТОЧНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ. Внутри списка найдите это:

'django.middleware.csrf. CsrfViewMiddleware',

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

Отключение защиты CSRF для определенного представления

Если вы хотите отключить защиту CSRF только для определенного представления Django, используйте @csrf_exempt декоратор. Вот фрагмент кода для демонстрации:

от django.views.decorators.csrf Импортировать csrf_exempt

@csrf_exempt
дефview_name(запрос):
# выполняем логику представления
проходить

@csrf_exempt decorator — лишь один из нескольких, связанных с защитой CSRF в Django. Об остальном можно прочитать на Справочник Django по CSRF.

Не отключайте защиту CSRF на своем сайте

Хотя Django делает это возможным, отключать встроенный в Django механизм защиты от CSRF не рекомендуется. Это сделает ваш сайт уязвимым для CSRF-атак и в конечном итоге негативно повлияет на пользователей вашего приложения.

Если вы не опытный разработчик, который знает, как реализовать собственный механизм защиты CSRF, вам следует работать с альтернативой, предоставляемой Django.