Django - как отключить проверку реферира - PullRequest
0 голосов
/ 06 декабря 2018

Я поместил веб-проект на основе Django (Cloudera Hue: https://github.com/cloudera/hue) за nginx, используемым для балансировки нагрузки и разгрузки SSL.

Застревание на ошибке 403 с ошибкой CSRF. Файл журнала содержит

5: 32: 32 PM ПРЕДУПРЕЖДЕНИЕ доступ
10.170.3.21 -anon- - "POST / account / login / HTTP / 1.1" - Ошибка проверки реферира - https://hue-dev.discover.abc.com/hue/accounts/login/?next=/ не соответствует https://hue -dev.discover.abc.com: 443 / .

Есть ли способ отключить проверку Referer в проекте Django?

Проверка Referer не добавляет никакой защиты, поскольку Referer в заголовке http может быть легко подделан. https://security.stackexchange.com/questions/66165/does-referrer-header-checking-offer-any-real-world-security-improvement

У меня уже есть следующее в nginx.conf

  proxy_set_header        Host $host;

  proxy_set_header        X-Real-IP $remote_addr;
  proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header        X-Forwarded-Proto $scheme;

  proxy_set_header        X-Forwarded-Host $host:$server_port;
  proxy_set_header        X-Forwarded-Server $host;

, а также пробовал следующие изменения, касающиеся атрибута http Referer:

  1. proxy_pass_header Referer
  2. proxy_hide_header Referer
  3. proxy_set_header $http_referer

все эти опции приводят к одной и той же ошибке проверки CSRF / Referer в бэкэнде Django / Hue.

Опятьдля менябыло бы проще отключить проверку Referer в Django.

Если это невозможно, то проблема, вероятно, в коде Django здесь: https://github.com/django/django/blob/22e8ab02863819093832de9f771bf40a62a6bd4a/django/middleware/csrf.py#L280

referer переменная существует объект urlparse (см. https://docs.python.org/3/library/urllib.parse.html), который содержитСвойство "netloc" с port.

Обратите внимание на ошибку снова - netloc s не совпадают, потому что у одного есть порт (443), а у другого его нет (порт 443 по умолчанию для https):

Сбой проверки реферира -

https://hue -dev.discover.abc.com / hue / accounts / login /? Next = /
не соответствует
https://hue -dev.discover.abc.com: 443 / .

, поэтому я предполагаю, что это должно быть какое-то преобразование Referer поля, сделанное в конфигурации nginx для вырезания443 порт явно (или добавить его).

Также здесь опубликована ошибка Django - https://code.djangoproject.com/ticket/30017 но я думаю, что все еще может быть проверка, отключите проверку Referer в Django или, по крайней мере, отредактируйте Referer, чтобы вырезать / добавить порт 443 для https через конфигурацию nginx

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Я нашел решение этой проблемы, установив статический Referer с портом 443, встроенным в URL-адрес

proxy_set_header Referer https://hue-dev.discover.abc.com:443/;

Хотя мне больше нравится ответ @ nebuler.

Все еще надеемся, что эта ошибка может быть исправлена ​​в Django.Их проверка реферера считает, что https://www.com и https://www.com:443 слишком разные вещи.https имеет порт 443 по умолчанию, так что это одно и то же.

0 голосов
/ 07 декабря 2018

Вы видите https://hue-dev.discover.abc.com:443/ из-за следующей строки в вашей конфигурации nginx:

proxy_set_header        X-Forwarded-Host $host:$server_port;

У вас уже есть X-Forwarded-Proto $scheme в вашей конфигурации, чтобы указать протокол, поэтому он должен быть безопасным для использования X-Forwarded-Host $host вместо.Это должно исправить вашу проблему.

Другой вариант, если вы игнорируете вышеизложенное, это добавить hue-dev.discover.abc.com:443 к CSRF_TRUSTED_ORIGINS в ваших настройках django.

Что касается вашего исходного вопроса, естьнет способа отключить проверку рефери django в вашей ситуации.Смотри здесь .

...