Django - 如何禁用 Referer 检查
Django - how to disable Referer check
我已经在 nginx 后面放了一个 Django-based web 项目 (Cloudera Hue: https://github.com/cloudera/hue) 用于负载平衡和 SSL 卸载。
卡在 403 错误和 CSRF 错误上。
日志文件包含
5:32:32 PM WARNING access
10.170.3.21 -anon- - "POST /accounts/login/ HTTP/1.1" -- Referer checking failed -
https://hue-dev.discover.abc.com/hue/accounts/login/?next=/ does not
match https://hue-dev.discover.abc.com:443/.
有没有办法在Django项目中禁用Referer检查?
Referer 检查不会增加任何安全性,因为 http header 中的 Referer 很容易被欺骗。 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;
并且还尝试了以下有关 Referer http 属性的更改:
proxy_pass_header Referer
proxy_hide_header Referer
proxy_set_header $http_referer
所有这些选项都会在 Django/Hue 后端产生相同的 CSRF/Referer 检查错误。
同样,对我来说,在 Django 中禁用 Referer 检查会更容易。
如果不可能,那么问题可能出在此处的 Django 代码中:
https://github.com/django/django/blob/22e8ab02863819093832de9f771bf40a62a6bd4a/django/middleware/csrf.py#L280
referer
变量有一个 urlparse object (参见 https://docs.python.org/3/library/urllib.parse.html ),其中包含“netloc” 属性 和 port
.
再次注意错误 - netloc
s 不匹配,因为一个有端口 (443) 而另一个没有(443 端口是 https 的默认端口):
Referer checking failed -
https://hue-dev.discover.abc.com/hue/accounts/login/?next=/
does not match
https://hue-dev.discover.abc.com:443/.
所以我想这应该是在 nginx 配置中进行的某种 Referer
字段转换,以明确地删除 443
端口(或添加它)。
还在此处发布了 Django 错误 - https://code.djangoproject.com/ticket/30017
但我想在 Django 中仍然可以检查是否禁用 Referer 检查,或者
至少通过 nginx 配置将 Referer 编辑到 cut/add 端口 443 for https?
您看到 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
应该是安全的。那应该可以解决您的问题。
另一种选择,如果您忽略上述内容,则在您的 django 设置中将 hue-dev.discover.abc.com:443
添加到 CSRF_TRUSTED_ORIGINS
。
至于你原来的问题,在你的情况下没有办法禁用django的referer检查。参见 here。
我找到了解决此问题的方法,方法是设置静态 Referer,并在 URL
中嵌入端口 443
proxy_set_header Referer https://hue-dev.discover.abc.com:443/;
虽然我更喜欢@nebuler 的回答。
仍然希望这个错误可以在 Django 中修复。
他们的 referer 检查认为 https://www.com
和 https://www.com:443
太不一样了。 https
有默认端口 443,所以它们是一样的。
我已经在 nginx 后面放了一个 Django-based web 项目 (Cloudera Hue: https://github.com/cloudera/hue) 用于负载平衡和 SSL 卸载。
卡在 403 错误和 CSRF 错误上。 日志文件包含
5:32:32 PM WARNING access
10.170.3.21 -anon- - "POST /accounts/login/ HTTP/1.1" -- Referer checking failed - https://hue-dev.discover.abc.com/hue/accounts/login/?next=/ does not match https://hue-dev.discover.abc.com:443/.
有没有办法在Django项目中禁用Referer检查?
Referer 检查不会增加任何安全性,因为 http header 中的 Referer 很容易被欺骗。 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;
并且还尝试了以下有关 Referer http 属性的更改:
proxy_pass_header Referer
proxy_hide_header Referer
proxy_set_header $http_referer
所有这些选项都会在 Django/Hue 后端产生相同的 CSRF/Referer 检查错误。
同样,对我来说,在 Django 中禁用 Referer 检查会更容易。
如果不可能,那么问题可能出在此处的 Django 代码中: https://github.com/django/django/blob/22e8ab02863819093832de9f771bf40a62a6bd4a/django/middleware/csrf.py#L280
referer
变量有一个 urlparse object (参见 https://docs.python.org/3/library/urllib.parse.html ),其中包含“netloc” 属性 和 port
.
再次注意错误 - netloc
s 不匹配,因为一个有端口 (443) 而另一个没有(443 端口是 https 的默认端口):
Referer checking failed -
https://hue-dev.discover.abc.com/hue/accounts/login/?next=/
does not match
https://hue-dev.discover.abc.com:443/.
所以我想这应该是在 nginx 配置中进行的某种 Referer
字段转换,以明确地删除 443
端口(或添加它)。
还在此处发布了 Django 错误 - https://code.djangoproject.com/ticket/30017 但我想在 Django 中仍然可以检查是否禁用 Referer 检查,或者 至少通过 nginx 配置将 Referer 编辑到 cut/add 端口 443 for https?
您看到 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
应该是安全的。那应该可以解决您的问题。
另一种选择,如果您忽略上述内容,则在您的 django 设置中将 hue-dev.discover.abc.com:443
添加到 CSRF_TRUSTED_ORIGINS
。
至于你原来的问题,在你的情况下没有办法禁用django的referer检查。参见 here。
我找到了解决此问题的方法,方法是设置静态 Referer,并在 URL
中嵌入端口 443proxy_set_header Referer https://hue-dev.discover.abc.com:443/;
虽然我更喜欢@nebuler 的回答。
仍然希望这个错误可以在 Django 中修复。
他们的 referer 检查认为 https://www.com
和 https://www.com:443
太不一样了。 https
有默认端口 443,所以它们是一样的。