Файл cookie csrf не установлен

Обновлено: 04.07.2024

При копировании кода на Linux-машины я просто заменил исходный файл исходного кода, но не удалил старые .pyc файлы, которые, как я думаю, не вызовут проблемы правильно?

Я получил одну из тех ошибок CSRF cookie not set от Django, но это не потому, что я забыл включить в свой шаблон.

Вот что я заметил:

Внутри Request Header значение cookie :

В плагине cookie, который я установил на хром, фактическое значение cookie csrf установлено на:

Внутри Request Header значение cookie :

В плагине cookie, который я установил на хром, фактическое значение cookie csrf установлено на:

Образец

Как видно из приведенных выше примеров, значение cookie внутри Request Header отличается от фактического csrfmiddlewaretoken в форме и значением фактического значения cookie.

Значение cookie текущего запроса соответствует следующему значению cookie request header's .

Чтобы помочь отладке, вот часть моего параметра settings.py:

Я использую Django 1.9.5 и python 2.7.10 .

Одно "решение"

Я столкнулся с этой проблемой до, я могу очистить все куки файлы своего браузера, и сайт будет работать правильно. Но эта проблема в конечном итоге снова появится, поэтому я действительно надеюсь, что кто-то может мне помочь (я, вероятно, просто сделал какую-то туманную ошибку).

Update

Первоначально я думал, что допустил некоторые ошибки при переопределении страницы django.contrib.auth.view , поэтому я написал свой собственный обработчик страницы входа в систему и все еще вызывает проблему.

Вот основная часть моего шаблона входа:

На машинах Linux у меня есть настройка сервера nginx как обратный прокси-сервер, который направляет запрос на порт 80 на 8001, и я запускаю сервер с помощью ./manage runserver localhost:8001 . Это единственное отличие, которое я могу представить с точки зрения настройки, В противном случае все исходный код и файл настроек идентичны.

Я начал удалять файлы cookie, но не все из них, это то, что я вижу перед их удалением:

введите описание изображения здесь

Я удалил все файлы cookie, отличные от djdt и csrftoken , затем работала страница. Могут ли удаленные файлы cookie каким-то образом преодолеть какой-то предел, который предотвратит установку csrftoken, который находится дальше списка?

Вот значение cookie изображения выше в заголовке запроса:

Поскольку сайт работает сейчас, у меня есть пять файлов cookie вместо 14, как показано выше:

введите описание изображения здесь

ОТВЕТЫ

Ответ 1

Вот проблема: У вас не может быть файла cookie, в котором содержится либо символ '[' или ']'

Я нашел решение после @Todor ссылка, затем я узнал об этом SO post. В основном была ошибка в python 2.7.x, которая не анализирует файлы cookie с ']' в значении. Исправлена ​​ошибка в 2.7.10.

Я подумал, что было бы хорошо подтвердить эту проблему. Поэтому я выкопал все файлы cookie и нашел один со следующим ключом/значением:

Итак, я ввел следующий файл cookie локально и отправил на сервер:

Работала страница входа, что означает, что 2.7.10 действительно исправил ошибку.

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

Оба файла cookie прерывают процесс входа в систему и отображают django:

Я хотел бы поблагодарить всех, кто оставил комментарий в OP: @raphv, @trinchet, @Phillip, @YPCrumble, @PeterBrittain и @Todor. Спасибо вам, ребята, за отладку со мной!

Обновление: 20 июля 2016 г.

Эта ошибка исправлена ​​в Django 1.10, просто нужно дождаться выпуска

Обновление: 19 июля 2016 г.

Im застрял, я уже очистил cookie, использовал другой браузер, но все равно CSRF cookie не установлен.

Это также может произойти, если CSRF_COOKIE_SECURE = True установлен, и вы получаете доступ к сайту небезопасно.

вы можете включить токен сеанса, передав опцию credentials: 'include' принести:

С этой Вы можете решить его, добавив ensure_csrf_cookie оформителя на ваш взгляд

если этот метод не работает. вы попытаетесь прокомментировать csrf в промежуточном по. и снова проверить.

эта проблема возникла снова недавно из-за ошибки в самом Python.

среди затронутых версий были 2.7.8 и 2.7.9. Файл cookie не был прочитан правильно, если одно из значений содержало [ символ.

обновление Python (2.7.10) устраняет проблему.

раньше я использовал Django 1.10.Поэтому я столкнулся с этой проблемой. Теперь я понизил его до Django 1.9, и он работает нормально.

Я столкнулся с аналогичной ситуацией во время работы с DRF, решение было добавлено .метод as_view() для представления в urls.py

попробуйте проверить, установлены ли ваши settings.py

в шаблоне данные форматируются с помощью csrf_token:

проблема, кажется, что вы не обращение GET запрашивает соответствующую или прямую публикацию данных без предварительного получения формы.

позже, пользователь заполняет форму и отправляет POST запрос с данными форм.

ваш взгляд должен быть:

убедитесь, что файлы cookie chrome установлены по умолчанию для веб-сайтов. Разрешить установку локальных данных (рекомендуется).

убедитесь, что ваш сервер сеанса django настроен правильно в settings.py - . Тогда попробуйте это,

добавьте это промежуточное ПО в settings.py под MIDDLEWARE_CLASSES или MIDDLEWARE в зависимости от версии django

get_token-возвращает токен CSRF, необходимый для формы POST. Маркер является буквенно-цифровым значением. Новый токен создается, если он еще не установлен.

У меня была такая же ошибка, в моем случае добавление method_decorator помогает:

Я только однажды встретил решение очистить куки. И может быть изменен при отладке SECRET_KEY связанных.

Кто-то сталкивался с таким ответом при колбеке с LiqPay?
Обрабатываю через:

Насколько я понимаю, ответ приходит без csrf_token (откуда же ему там взятся). Ну раз так, я ставлю декоратор @csrf_exempt. Но почему декоратор не срабатывает и появляется ошибка?
p.s. Ставил CSRF_COOKIE_SECURE = True - не помогло. django.middleware.csrf.CsrfViewMiddleware установлен.

  • Вопрос задан более трёх лет назад
  • 1081 просмотр

tumbler

Вроде бы всё по инструкции:
раз
два
Но я бы попробовал еще с конечной функцией поиграться.
Спасибо, но все эти способы пробовал ранее, ошибка та же (

tumbler

Ну мистика же! Django 2.0.4

Такой код работает. Дальше надо менять его постепенно на то, что в примере и смотреть, на каком изменении перестает работать.

Не помогло (
Частичное решение проблемы оказалось неожыданым. Вынес в основные ответы.

Не пойму, что к чему, но решение нашел в следующем:

Перенес урл и вюшку в другой апп и все заработало.
Почему то в первоначальном аппе не срабатывал декоратор csrf_exempt.
Если кто знает почему так произошло - поделитесь.

Обидно, что потратил на это день.

Добавил решение вашего вопроса. Правда, почему не срабатывает решение из коробки, я так и не выяснил.

Так же, как и автор вопроса, столкнулся с данной проблемой, при реализации веб-хуков для чат-ботов.

Перенаправление на другое приложение django у меня работало изначально.
Но, при написании универсального приложения, это не выход.

Изучил исходники django. Судя по всему, каким то образом CsrfViewMiddleware не видит у коллбека (view) поля csrf_exempt, которое и добавляется одноименным декоратором.
../django/middleware/csrf.py:212 (django 2.2)

Соответственно выходом будет добавить данное поле самостоятельно в результирующую view-функцию:

Я застрял, я уже очистил файл cookie, использовал другой браузер, но все еще не установил файл cookie csrf.

У меня очень странная проблема - CSRF cookie не установлен на некоторых клиентских браузерах. Что это может быть потенциально? Все необходимое промежуточное программное обеспечение включено, и, как я уже сказал выше, проблема появляется только на очень небольшом количестве машин, хотя там хорошо.

Вы можете включить маркер сеанса, передав опцию credentials: 'include' для извлечения:

Из этого вы можете решить эту проблему, добавив декоратор ensure_csrf_cookie в свой вид

если этот метод не сработает. вы попытаетесь прокомментировать csrf в промежуточном программном обеспечении. и проверьте еще раз.

Если вы используете DRF, проверьте правильность ваших url-шаблонов, возможно, вы забыли .as_view() :

Так вот как выглядел мой код:

И так оно и должно быть:

Я столкнулся с аналогичной ситуацией во время работы с DRF, решение заключалось в добавлении метода .as_view() к представлению в urls.py

попробуйте проверить, установлены ли вы в settings.py

В шаблоне данные форматируются с помощью csrf_token:

У меня есть некоторые проблемы в течение некоторого времени, я испытываю CSRF Cookie не установлен. Пожалуйста, посмотрите на коды ниже views.py from django.shortcuts import render_to_response from django.contrib.auth import authenticate, login from django.conf.urls import patterns, url, include.

Эта проблема снова возникла недавно из-за ошибки в самом Python.

Среди затронутых версий были 2.7.8 и 2.7.9. Файл cookie не считывался правильно, если одно из значений содержало символ [ .

Обновление Python (2.7.10) устраняет проблему.

Это также происходит, когда вы не задаете действие формы.
Для меня это показывало эту ошибку, когда код был:

Когда я исправил свой код в этом:

моя ошибка исчезла.

Проблема, по-видимому, заключается в том, что вы не обрабатываете запросы GET должным образом или непосредственно публикуете данные без предварительного получения формы.

Позже пользователь заполняет форму и отправляет запрос POST с данными формы.

Ваш взгляд должен быть:

Убедитесь, что файлы cookie chrome установлены по умолчанию для веб-сайтов. Разрешить установку локальных данных (рекомендуется).

Потому что метод render_to_response может вызвать некоторые проблемы с файлами cookie ответа.

Я только один раз встречался, решение состоит в том, чтобы очистить печенье. И может быть изменен во время отладки, связанной с SECRET_KEY.

Я использовал Django 1.10 before.So Я столкнулся с этой проблемой. Теперь я понизил его до Django 1.9, и он работает нормально.

Убедитесь, что серверная часть сеанса django правильно настроена в settings.py. Тогда попробуйте это,

Добавьте это промежуточное программное обеспечение в settings.py под MIDDLEWARE_CLASSES или MIDDLEWARE в зависимости от версии django

get_token - Возвращает токен CSRF, необходимый для формы POST. Токен представляет собой буквенно-цифровое значение. Новый токен создается, если он еще не установлен.

У меня была та же ошибка, в моем случае добавление method_decorator помогает:

На ваш взгляд, используете ли вы декоратор csrf??

from django.views.decorators.csrf import csrf_protect

@csrf_protect def view(request, params): .

Похожие вопросы:

Мне было интересно, что происходит с ошибкой CSRF Cookie not set , которую Django бросает на меня все время. Я создал представление (см. ниже), которое является обратным вызовом для оплаты. Я не.

Мое приложение django использует ajax для добавления элемента в shopping cart. Метод запроса ajax-это POST, и я включаю заголовок запроса через js: var csrftoken = getCookie('csrftoken');.

У меня очень странная проблема - CSRF cookie не установлен на некоторых клиентских браузерах. Что это может быть потенциально? Все необходимое промежуточное программное обеспечение включено, и, как.

AoA Я новичок в Django, я пытаюсь получить данные из POST, но получаю ошибку CSRF cookie не установлен, Я много пытался найти решение в google и stackoverflow через google тоже, но потерпел неудачу.

У меня есть некоторые проблемы в течение некоторого времени, я испытываю CSRF Cookie не установлен. Пожалуйста, посмотрите на коды ниже views.py from django.shortcuts import render_to_response from.

У меня проблема с CSRF cookie not set. Все, что мне нужно, это чтобы внешняя биллинговая платформа отправила обновление на сервер django. Локально он работает с Postman, но на демо-сервере он не.

У меня возникли проблемы с django-paypal, проблема возникает в момент получения paypal IPN, когда платеж успешно завершен. Ошибка : Forbidden (CSRF cookie not set.): /paypal/ [15/Sep/2019 22:53:04].

Промежуточное ПО CSRF и теги шаблонов упрощают защиту от атак с подделкой межсайтовых запросов . Этот тип атаки происходит, когда вредоносный веб-сайт содержит ссылку, кнопку формы или фрагмент кода JavaScript, который предназначен для выполнения действия на вашем веб-сайте с использованием учетных данных авторизованного пользователя, который посещает вредоносный сайт в своем браузере. Также рассматривается родственный тип атаки: «CSRF login», когда атакующий сайт обманывает браузер пользователя, подключаясь к сайту с чужими учетными данными.

Как пользоваться ¶

Чтобы воспользоваться преимуществами защиты CSRF в представлениях, сделайте следующее:

По умолчанию промежуточное ПО CSRF включено в настройках MIDDLEWARE . Если вы переопределите этот параметр, помните, что это 'django.middleware.csrf.CsrfViewMiddleware' должно происходить до того, как промежуточное ПО, которое полагается на CSRF-атаки, уже было отражено.

Если вы отключите его, что не рекомендуется, вы можете использовать его csrf_protect() в некоторых представлениях, которые хотите защитить (см. Ниже).

В любом шаблоне, который использует форму POST, используйте тег шаблона csrf_token внутри тега HTML, <form> если форма ссылается на внутренний URL-адрес, например:

С другой стороны, этого не следует делать для форм POST, нацеленных на внешние URL-адреса, поскольку это приведет к раскрытию токена CSRF и, таким образом, приведет к уязвимости.

В соответствующих функциях просмотра проверьте, что RequestContext используется для создания ответа, чтобы он работал правильно. Если вы используете функцию , общие представления или дополнительные приложения, не нужно беспокоиться, потому что все эти представления используют . render() RequestContext

Рекомендуемым источником для токена является файл cookie csrftoken , который будет присутствовать, если у вас включена защита CSRF для вашего представления, как показано выше.

Файл cookie CSRF имеет имя csrftoken по умолчанию, но вы можете изменить это имя в настройках CSRF_COOKIE_NAME .

Получить токен можно так:

Приведенный выше код можно упростить, заменив библиотеку Cookie JavaScript getCookie :

Маркер CSRF также присутствует в DOM, но только если он явно включен с помощью тега csrf_token в шаблоне. Файл cookie будет содержать стандартный токен; он CsrfViewMiddleware предпочтет cookie токену DOM. В любом случае вы гарантированно получите cookie, если токен присутствует в DOM, поэтому лучше использовать cookie!

Если представление не использует шаблон, содержащий тег csrf_token , Django может не установить файл cookie CSRF. Такая ситуация часто возникает в случаях, когда формы динамически добавляются на страницу. Чтобы решить эту проблему, Django предоставляет вид декоратора , который заставляет использовать куки: ensure_csrf_cookie() .

Установка токена для запроса AJAX ¶

Наконец, вам нужно установить заголовок для вашего запроса AJAX. Используя API fetch () :

Использование CSRF в шаблонах Jinja2 ¶

Jinja2 Механизм шаблонов Django добавляет контекст всех шаблонов, что эквивалентно языку шаблонов Django. Например : >

Метод декоратора ¶

Вместо того, чтобы добавлять CsrfViewMiddleware в качестве общей защиты, вы можете использовать декоратор csrf_protect , который предлагает точно такую ​​же функциональность, для конкретных представлений, которые нуждаются в защите. Этот декоратор следует использовать как в представлениях, которые включают в себя токен CSRF, так и в представлениях, которые принимают данные формы POST. (Часто это одна и та же функция просмотра, но не всегда).

Не рекомендуется прибегать к использованию одного декоратора , потому что, если вы забудете его использовать, у вас будет дыра в безопасности. Стратегия «пояс и подтяжки» с использованием того и другого хороша и приведет лишь к минимальной перегрузке.

Декоратор, обеспечивающий защиту представления, подобную промежуточному программному обеспечению CsrfViewMiddleware .

Если вы используете представления на основе классов, вы можете обратиться к разделу «Украшение представлений на основе классов» .

Отклоненные запросы ¶

По умолчанию пользователю возвращается ответ «403 Forbidden», если входящий запрос не удовлетворяет проверкам, выполненным пользователем CsrfViewMiddleware . Как правило, это должно появляться только в том случае, если это настоящая атака «Подделка межсайтового запроса» или когда из-за ошибки программирования токен CSRF не был включен в форму. типа POST.

Однако страница с ошибкой не очень приятная, поэтому вы можете предоставить собственное представление для решения этой проблемы. Для этого определите настройку CSRF_FAILURE_VIEW .

Сбои CSRF регистрируются как предупреждения в журнале django.security.csrf .

Операция ¶

Защита CSRF основана на следующем:

Файл cookie CSRF, основанный на случайном секретном значении, к которому другие сайты не будут иметь доступа.

Этот файл cookie создается промежуточным программным обеспечением CsrfViewMiddleware . Он отправляется с каждым вызванным ответом django.middleware.csrf.get_token() (функция, используемая внутри для получения токена CSRF), если он еще не был определен для запроса.

Для защиты от атак BREACH токен - это не просто секрет; к секрету добавляется случайная маска, которая используется для его шифрования.

По соображениям безопасности секретное значение изменяется каждый раз, когда пользователь входит в систему.

Скрытое поле формы с именем «csrfmiddlewaretoken» присутствует во всех исходящих формах POST. Значение этого поля, опять же, является значением секрета с маской, которая добавляется к нему и используется для его шифрования. Маска регенерируется при каждом вызове, get_token() поэтому значение поля формы изменяется в каждом таком ответе.

Это действие выполняется тегом шаблона.

При проверке значения поля csrfmiddlewaretoken только секретное значение, а не полный токен, сравнивается с секретным значением содержимого cookie. Это позволяет использовать постоянно меняющиеся токены. Хотя каждый запрос может использовать свой токен, секретное значение остается общим для всех.

Эта проверка выполняется промежуточным программным обеспечением CsrfViewMiddleware .

Расширение принятых рефереров за пределы текущего хоста или домена cookie можно выполнить с помощью этой настройки CSRF_TRUSTED_ORIGINS .

Это гарантирует, что для возврата данных с запросом POST можно использовать только формы, исходящие из доверенных доменов.

Удаление заголовка Referer

Чтобы избежать раскрытия URL-адреса реферера сторонним сайтам, может быть желательно отключить реферер в тегах <a> вашего сайта. Например, можно использовать тег или включить заголовок . Из-за строгого контроля реферера в защите CSRF для запросов HTTPS эти методы приводят к сбоям CSRF для «небезопасных» запросов методов. Лучше использовать альтернативы, такие как ссылки на сторонние сайты. <meta name="referrer" content="no-referrer"> Referrer-Policy: no-referrer <a rel="noreferrer" . >"

Кеширование ¶

Если тег шаблона csrf_token используется шаблоном (или функция get_token вызывается другим способом), промежуточное ПО CsrfViewMiddleware добавляет в ответ файл cookie и заголовок . Это означает, что промежуточное ПО будет хорошо работать с промежуточным ПО кеширования, если оно используется в соответствии с инструкциями ( должно быть помещено в настройки перед любым другим промежуточным ПО). Vary: Cookie UpdateCacheMiddleware

Однако, если вы используете декораторы кеша для отдельных представлений, промежуточное ПО CSRF еще не сможет установить заголовок Vary или файл cookie CSRF, и ответ будет кэшироваться без них. Другой. В этом случае в представлениях, которые требуют вставки токена CSRF, вы должны django.views.decorators.csrf.csrf_protect() сначала использовать декоратор функции :

Если вы используете представления на основе классов, вы можете обратиться к разделу «Украшение представлений на основе классов» .

Тесты ¶

Ограничения ¶

Поддомены сайта могут размещать файлы cookie на клиенте для всего домена. Установив файл cookie и используя соответствующий токен, поддомены смогут обойти защиту CSRF. Единственный способ избежать этого - убедиться, что поддомены контролируются доверенными пользователями (или, по крайней мере, не могут устанавливать файлы cookie). Обратите внимание, что даже без CSRF существуют другие уязвимости, такие как фиксация сеанса, из-за которых выдача субдоменов ненадежным третьим сторонам является плохой идеей; эти уязвимости не могут быть легко устранены с помощью текущих браузеров.

Особые случаи ¶

Некоторые представления могут иметь необычные требования, которые подразумевают, что они не соответствуют нормальной модели, рассматриваемой здесь. В таких ситуациях может быть полезен ряд утилит. Сценарии, которые могут потребоваться, описаны в следующем разделе.

Утилиты ¶

Приведенные ниже примеры относятся к представлениям на основе функций. Если вы используете представления на основе классов, вы можете обратиться к разделу «Украшение представлений на основе классов» .

Этот декоратор отмечает представление как освобожденное от защиты, обеспечиваемой промежуточным программным обеспечением. Пример:

Обычно тег шаблона csrf_token не работает, если не CsrfViewMiddleware.process_view использовался аналогичный аналог csrf_protect . Декоратор представления requires_csrf_token можно использовать, чтобы убедиться, что тег шаблона работает. Этот декоратор работает аналогично csrf_protect , но никогда не отклоняет входящий запрос.

Этот декоратор заставляет представление отправлять файл cookie CSRF.

Сценарии ¶

Для некоторых представлений необходимо отключить защиту 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() частности, для пути, который необходимо защитить. Пример:

Решение: используйте ensure_csrf_cookie() в представлении, которое отправляет страницу.

Встроенные и многоразовые приложения ¶

Поскольку разработчик может отключить промежуточное ПО CsrfViewMiddleware , все затронутые представления в приложениях Contrib Django используют декоратор, csrf_protect чтобы гарантировать, что эти приложения защищены от атак CSRF. Рекомендуется, чтобы разработчики других многоразовых приложений, которые хотят предложить те же гарантии, также использовали декоратор csrf_protect для своих представлений.

Настройки ¶

Для управления поведением Django против CSRF можно использовать ряд настроек:

Часто задаваемые вопросы ¶

Является ли отправка пары произвольных токенов CSRF (данные cookie и POST) уязвимостью? ¶

Некоторые инструменты аудита безопасности сообщают об этом как о проблеме, но, как упоминалось выше, злоумышленник не может украсть файл cookie CSRF из браузера пользователя. Возможность «украсть» или изменить собственный токен с помощью Firebug, инструментов разработчика Chrome и т. Д. не означает, что это уязвимость.

Проблематично ли, что защита Django CSRF по умолчанию не привязана к сеансу? ¶

Нет, сознательно нет. Отсутствие привязки защиты CSRF к сеансу позволяет использовать защиту на таких сайтах, как pastebin, которые разрешают отправку данных анонимным пользователям, у которых нет сеанса.

Если вы хотите сохранить токен CSRF в сеансе пользователя, установите параметр CSRF_USE_SESSIONS .

Почему после входа в систему пользователь может получить ошибку проверки CSRF? ¶

Читайте также: