Отключить csrf в Django
Необходимо отключить проверку csrf на POST запросы. Я пишу просто API на Django, к API можно получить доступ только по секретному ключу (150 знаков), и даже если есть ключ, то еще нужна авторизация, после успешной авторизации выдается access_token на время, потом нужно обновлять, так что в общем-то не вижу надобности в csrf.
Сейчас сделал что есть отдельный метод у API csrf_token который будет возвращать этот самый токен, но мне такое решение не нравится

Int64 ★★★
02.10.15 19:27:27 MSK
Как в Django2 отключить csrf валидацию?
Пишу возможность оставлять комментарии на сайте. Делаю все через Ajax. Когда методом POST делаю запрос, Django выдает то, что не передался csrf токен. Как отключить его не во всем проекте, а только для одной вьюхи? (Версия Django: 2.2.1)
Отслеживать
задан 9 мая 2019 в 17:33
Ибрагим Асеев Ибрагим Асеев
50 8 8 бронзовых знаков
А зачем его отключать в методе POST?
9 мая 2019 в 17:40
Просто передавайте csrf-токен в ваших ajax-запросах
9 мая 2019 в 17:49
откуда его брать? Как-то генерировать или же из куков?
9 мая 2019 в 17:50
@ИбрагимАсеев Вам уже ответили
9 мая 2019 в 18:40
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Отслеживать
ответ дан 9 мая 2019 в 17:40
Sergey Gornostaev Sergey Gornostaev
66.5k 6 6 золотых знаков 53 53 серебряных знака 112 112 бронзовых знаков
А когда я использую встроенные формы Django, в скрытом input’е добавляется csrf_token. Чем этот токен отличается от токена, который в куках? И какой токен нужно передавать из аджакса, тот который в куках, или его нужно как-то генерировать?
9 мая 2019 в 17:47
Это один и тот же токен. В куках токен дублируется для тех случаев, когда ajax-запрос делает без формы.
Выключить CSRF

Url dispatcher направляет запрос именно в эту вьюху — вон там рядом метод Get для дебага, он ловит запросы.
Должно бы работать. Но не работает.
Был бы очень признателен за помощь.
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Django csrf cookie —нужно определить в чем ошибка CSRF cookie not set
НУжна помощь в определений ошибки как исправить в папке Templates находится файл index.py.
Django 1.10 csrf
Добрый день! Пишу сюда от безысходности. Django версии 1.10. Не получается импортировать from.

CSRF DJANGO
Люди добрые подскажите пожалуйста как передать csrf токен из django-rest в react. Думал это.

CSRF защита
Здраствуйте, подскажите пожалуйста почему Django отказывается брать csrf токен из заголовка .
3524 / 2682 / 334
Регистрация: 11.03.2009
Сообщений: 6,142
Это джанго или ДРФ? Ынтернеты говорят, что у ДРФ таки проблемы, пример решения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
from rest_framework.authentication import SessionAuthentication class CsrfExemptSessionAuthentication(SessionAuthentication): def enforce_csrf(self, request): return None class AddingSomething(GenericAPIView): permission_classes = (permissions.AllowAny, ) serializer_class = AddSomethingSerializer authentication_classes = (CsrfExemptSessionAuthentication,) queryset = None def post(self, request, **kwargs): # .. Some magic .. return HttpResponseRedirect(redirect_to=reverse('something_added'))
Регистрация: 15.09.2017
Сообщений: 72
мне кажется что вот из за этого мидлвейра ‘django.middleware.csrf.CsrfViewMiddleware’, попробуй с загаловками поигратся покидай туда сесию и crf, а вообще это все возникает когда при посте этот метод не разрешен , стоит пермишен != all
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
CSRF cookie not set
Учусь работать с Django 2.1.2. При попытке отправить POST форму, выдает: Forbidden (403) CSRF.
Django Ошибка доступа (403) Ошибка проверки CSRF. Запрос отклонён
На хостинге разместил сайт и не могу войти в админку, т.к. возникает 403 ошибка "Ошибка доступа.
Включить\Выключить Меню через админку
Допустим на сайте есть меню , один из пунктов нужно временно отключить, желательно через админку.
Csrf не найден или не совпадает
проблема такова: Есть форма(заполняет пользователь) которую получаю, обрабатываю, перевожу на.
CSRF verification failed. Request aborted
Есть два представления: def RegEnd(request): #Здесь совершаем действия по чтению ПОСТ.
Ошибка «CSRF token missing or incorrect» при передаче информации в форме
Вообщем создал я модели(не суть важно какие). Через админку добавил группу пользователей и.
Или воспользуйтесь поиском по форуму:
Как использовать защиту от CSRF в Django¶
Чтобы воспользоваться преимуществами защиты от CSRF в ваших представлениях, выполните следующие шаги:
- По умолчанию промежуточное ПО CSRF активировано в настройках MIDDLEWARE . Если вы переопределите эту настройку, помните, что ‘django.middleware.csrf.CsrfViewMiddleware’ должно стоять перед любым промежуточным ПО представления, которое предполагает, что CSRF-атаки были обработаны. Если вы отключили его, что не рекомендуется, вы можете использовать csrf_protect() на определенных представлениях, которые вы хотите защитить (см. ниже).
- В любом шаблоне, использующем форму POST, используйте тег csrf_token внутри элемента , если форма предназначена для внутреннего URL, например:
form method="post"> csrf_token %>
Использование защиты CSRF в AJAX¶
Хотя описанный выше метод можно использовать для AJAX POST-запросов, он имеет некоторые неудобства: вы должны помнить о необходимости передавать CSRF-токен в качестве POST-данных при каждом POST-запросе. По этой причине существует альтернативный метод: при каждом XMLHttpRequest устанавливайте в пользовательский заголовок X-CSRFToken (как указано в настройке CSRF_HEADER_NAME ) значение маркера CSRF. Это часто проще, поскольку многие JavaScript-фреймворки предоставляют крючки, которые позволяют устанавливать заголовки при каждом запросе.
Сначала необходимо получить токен CSRF. Как это сделать, зависит от того, включены ли параметры CSRF_USE_SESSIONS и CSRF_COOKIE_HTTPONLY .
Получение маркера, если CSRF_USE_SESSIONS и CSRF_COOKIE_HTTPONLY составляют False ¶
Рекомендуемым источником маркера является cookie csrftoken , который будет установлен, если вы включили защиту CSRF для ваших представлений, как описано выше.
По умолчанию маркер CSRF имеет имя csrftoken , но вы можете управлять именем cookie с помощью параметра CSRF_COOKIE_NAME .
Вы можете приобрести токен следующим образом:
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(); // Does this cookie string begin with the name we want? if (cookie.substring(0, name.length + 1) === (name + '=')) cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; > > > return cookieValue; > const csrftoken = getCookie('csrftoken');
Приведенный выше код можно упростить, используя JavaScript Cookie library для замены getCookie :
const csrftoken = Cookies.get('csrftoken');
Токен CSRF также присутствует в DOM в маскированной форме, но только если он явно включен в шаблон с помощью csrf_token . Cookie содержит канонический, незамаскированный маркер. CsrfViewMiddleware будет принимать любой из них. Однако для защиты от атак BREACH рекомендуется использовать маскированный токен.
Если ваше представление не выводит шаблон, содержащий тег шаблона csrf_token , Django может не установить куки CSRF-токена. Это часто встречается в случаях, когда формы динамически добавляются на страницу. Для решения этой проблемы Django предоставляет декоратор представления, который принудительно устанавливает cookie: ensure_csrf_cookie() .
Получение маркера, если CSRF_USE_SESSIONS или CSRF_COOKIE_HTTPONLY — True ¶
Если вы активируете CSRF_USE_SESSIONS или CSRF_COOKIE_HTTPONLY , вы должны включить маркер CSRF в ваш HTML и прочитать маркер из DOM с помощью JavaScript:
csrf_token %> script> const csrftoken = document.querySelector('[name=csrfmiddlewaretoken]').value; script>
Установка маркера в запросе AJAX¶
Наконец, вам нужно установить заголовок в запросе AJAX. Использование API fetch():
const request = new Request( /* URL */, method: 'POST', headers: 'X-CSRFToken': csrftoken>, mode: 'same-origin' // Do not send CSRF token to another domain. > ); fetch(request).then(function(response) // . >);
Использование защиты CSRF в шаблонах Jinja2¶
Бэкенд шаблонов Django Jinja2 добавляет > в контекст всех шаблонов, что эквивалентно в языке шаблонов Django. Например:
form method="post"> <csrf_input >>
Использование метода декоратора¶
Вместо того чтобы добавлять CsrfViewMiddleware в качестве абсолютной защиты, вы можете использовать декоратор csrf_protect() , который обладает точно такой же функциональностью, для определенных представлений, которые нуждаются в защите. Он должен использоваться как для представлений, которые вставляют CSRF-токен в вывод, так и для тех, которые принимают данные POST-формы. (Часто это одна и та же функция представления, но не всегда).
Использование декоратора само по себе не рекомендуется, поскольку если вы забудете его использовать, у вас будет дыра в безопасности. Стратегия «пояса и скобок», при которой используются оба декоратора, вполне подходит, и накладные расходы будут минимальными.
Обработка отклоненных запросов¶
По умолчанию пользователю отправляется ответ „403 Forbidden“, если входящий запрос не проходит проверку, выполняемую CsrfViewMiddleware . Обычно это происходит только в случае настоящей подделки межсайтовых запросов или когда из-за ошибки программирования маркер CSRF не был включен в форму POST.
Однако страница ошибки не очень дружелюбна, поэтому вы можете захотеть создать собственное представление для обработки этого условия. Для этого установите параметр CSRF_FAILURE_VIEW .
Сбои CSRF регистрируются как предупреждения в журнале django.security.csrf .
Использование защиты CSRF с кэшированием¶
Если тег шаблона csrf_token используется шаблоном (или функция get_token вызывается каким-либо другим способом), CsrfViewMiddleware добавит cookie и заголовок Vary: Cookie в ответ. Это означает, что промежуточное ПО будет хорошо взаимодействовать с промежуточным ПО кэша, если оно используется в соответствии с инструкциями ( UpdateCacheMiddleware идет перед всеми другими промежуточными ПО).
Однако, если вы используете декораторы кэша на отдельных представлениях, промежуточное ПО CSRF еще не сможет установить заголовок Vary или куки CSRF, и ответ будет кэширован без них. В этом случае для всех представлений, которые потребуют вставки маркера CSRF, следует сначала использовать декоратор django.views.decorators.csrf.csrf_protect() :
from django.views.decorators.cache import cache_page from django.views.decorators.csrf import csrf_protect @cache_page(60 * 15) @csrf_protect def my_view(request): .
Если вы используете представления на основе классов, вы можете обратиться к Decorating class-based views .
Тестирование и защита от CSRF¶
Декоратор CsrfViewMiddleware обычно сильно мешает тестированию функций представления из-за необходимости использования CSRF-токена, который должен быть отправлен с каждым POST-запросом. По этой причине HTTP-клиент Django для тестов был модифицирован для установки флага в запросах, который ослабляет промежуточное программное обеспечение и декоратор csrf_protect , так что они больше не отклоняют запросы. Во всех остальных отношениях (например, отправка cookies и т.д.) они ведут себя одинаково.
Если по каким-то причинам вы хотите, чтобы тестовый клиент выполнял CSRF-проверку, вы можете создать экземпляр тестового клиента, который будет выполнять CSRF-проверку:
>>> from django.test import Client >>> csrf_client = Client(enforce_csrf_checks=True)
Краевые случаи¶
Определенные представления могут иметь необычные требования, которые означают, что они не вписываются в обычную схему, предусмотренную здесь. В таких ситуациях может быть полезен ряд утилит. Сценарии, в которых они могут понадобиться, описаны в следующем разделе.
Отключение защиты CSRF только для нескольких просмотров¶
Большинство представлений требуют защиты от CSRF, но некоторые не требуют.
Решение: вместо того чтобы отключать промежуточное ПО и применять csrf_protect ко всем представлениям, которым оно необходимо, включите промежуточное ПО и используйте csrf_exempt() .
Установка маркера, когда CsrfViewMiddleware.process_view() не используется¶
Бывают случаи, когда CsrfViewMiddleware.process_view может не выполняться до запуска вашего представления — например, обработчики 404 и 500 — но вам все равно нужен CSRF-токен в форме.
Включение маркера CSRF в незащищенное представление¶
Могут быть некоторые представления, которые не защищены и были исключены с помощью csrf_exempt , но все равно должны включать маркер CSRF.
Решение: используйте csrf_exempt() , за которым следует requires_csrf_token() . (т.е. requires_csrf_token должен быть самым внутренним декоратором).
Защита представления только для одного пути¶
Представление нуждается в защите CSRF только при одном наборе условий, и не должно иметь ее в остальное время.
Решение: используйте csrf_exempt() для всей функции представления, и csrf_protect() для пути внутри нее, который нуждается в защите. Пример:
from django.views.decorators.csrf import csrf_exempt, csrf_protect @csrf_exempt def my_view(request): @csrf_protect def protected_path(request): do_something() if some_condition(): return protected_path(request) else: do_something_else()
Защита страницы, использующей AJAX без HTML-формы¶
Страница делает POST-запрос через AJAX, и на странице нет HTML-формы с csrf_token , которая бы вызвала отправку требуемого CSRF-куки.
Решение: используйте ensure_csrf_cookie() в представлении, которое отправляет страницу.
Защита от CSRF в многократно используемых приложениях¶
Поскольку разработчик может отключить CsrfViewMiddleware , все соответствующие представления в приложениях contrib используют декоратор csrf_protect для обеспечения безопасности этих приложений от CSRF. Рекомендуется, чтобы разработчики других многократно используемых приложений, которые хотят получить такие же гарантии, также использовали декоратор csrf_protect в своих представлениях.