我已经在nginx后面放置了一个基于Django的Web项目(Cloudera Hue:https://github.com/cloudera/hue),用于负载平衡和SSL卸载。
由于CSRF错误而陷入403错误。 日志文件包含
5:32:32 PM警告访问
10.170.3.21 -anon--“ POST / accounts / login / HTTP / 1.1”-引用检查失败- https://hue-dev.discover.abc.com/hue/accounts/login/?next=/不 匹配https://hue-dev.discover.abc.com:443/。
是否可以在Django项目中禁用引荐检查?
Referer检查不会增加任何安全性,因为很容易欺骗http标头中的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对象(请参阅https://docs.python.org/3/library/urllib.parse.html),该对象包含带有port
的“ netloc”属性。
再次注意该错误-netloc
不匹配,因为一个端口(443),另一个端口(https默认为443端口):
引荐来源检查失败-
https://hue-dev.discover.abc.com/hue/accounts/login/?next=/
不匹配
https://hue-dev.discover.abc.com:443/。
所以我想应该是在nginx config中进行的Referer
字段转换,以明确切出(或添加)443
端口。
还在此处发布了Django错误-https://code.djangoproject.com/ticket/30017 但是我想仍然可能有一个检查在Django中禁用引荐检查,或者 至少要通过Nginx配置为https剪切/添加端口443?
答案 0 :(得分:1)
由于nginx配置中的以下行,您看到https://hue-dev.discover.abc.com:443/
:
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的引荐检查。参见here。
答案 1 :(得分:0)
我通过设置带有URL中嵌入的端口443的静态Referer找到了解决此问题的方法
proxy_set_header Referer https://hue-dev.discover.abc.com:443/;
尽管我更喜欢@nebuler的答案。
仍然希望此错误可以在Django中修复。
他们的推荐人检查认为https://www.com
和https://www.com:443
太不同了。 https
具有默认端口443,因此它们是同一端口。