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 属性的更改:

  1. proxy_pass_header Referer
  2. proxy_hide_header Referer
  3. 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.

再次注意错误 - netlocs 不匹配,因为一个有端口 (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.comhttps://www.com:443 太不一样了。 https 有默认端口 443,所以它们是一样的。