如何在Django中为CSRF_TRUSTED_ORIGINS设置通配符



从Django 2更新到Django 4.0.1后,我在所有POST请求中都收到了CSRF错误。日志显示:

"警告:django.security.csrf:禁止(来源检查失败-https://127.0.0.1与任何可信来源不匹配。(:/激活/";

我不知道如何为CSRF_TRUSTED_ORIGINS设置通配符?我有一台服务器运送给在自己的域上托管它的客户,所以我不可能事先没有来源。我尝试了以下没有运气:

CSRF_TRUSTED_ORIGINS = ["https://*", "http://*"]

CSRF_TRUSTED_ORIGINS = ["*"]

显式设置";https://127.0.0.1"在CSRF_TRUSTED_ORIGINS中工作,但在我的客户的生产部署中不工作,这将获得另一个主机名。

Django应用程序在NGINX背后使用Gunicorn运行。因为SSL在NGINX请求后终止。is_secure((返回false,导致Origin标头与此处的主机不匹配:

https://github.com/django/django/blob/3ff7f6cf07a722635d690785c31ac89484134bee/django/middleware/csrf.py#L276

我通过在Django中添加以下内容解决了这个问题:

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

并确保NGINX在我的NGINX conf中使用以下内容转发http方案:

proxy_set_header X-Forwarded-Proto $scheme;

是的,它在4.0版本中发生了变化,正如你在这里看到的

Django 4.0中的更改:

旧版本中的值必须仅包括主机名(可能带有前导点(,而不是scheme或星号

此外,原始标头检查在旧版本中不执行。

注意:您不应该在生产中使用*

相关内容

最新更新