Я поместил веб-проект на основе 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:
proxy_pass_header Referer
proxy_hide_header Referer
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