【问题标题】:How do I set a wildcard for CSRF_TRUSTED_ORIGINS in Django?如何在 Django 中为 CSRF_TRUSTED_ORIGINS 设置通配符?
【发布时间】:2022-01-13 07:10:15
【问题描述】:

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

“警告:django.security.csrf:Forbidden(来源检查失败 - https://127.0.0.1 不匹配任何受信任的来源。):/activate/”

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

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

CSRF_TRUSTED_ORIGINS = ["*"]

在 CSRF_TRUSTED_ORIGINS 中显式设置“https://127.0.0.1”有效,但在我客户的生产部署中不起作用,它将获得另一个主机名。

【问题讨论】:

    标签: python django csrf


    【解决方案1】:

    Django 应用在 NGINX 后面使用 Gunicorn 运行。因为 SSL 在 NGINX request.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;
    

    【讨论】:

      【解决方案2】:

      是的,它在 4.0 版本中发生了变化,您可以在此处看到 here

      在 Django 4.0 中更改:

      旧版本中的值只能包括 主机名(可能带有前导点)而不是方案或 星号。

      此外,旧版本不执行 Origin 标头检查。

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

      【讨论】:

      • django 应用程序和前端在同一个域上运行。我只是不知道构建时该域是什么。当 Host 和 Origin 标头相同时,我不确定为什么必须指定 CSRF_TRUSTED_ORIGINS。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-17
      • 2019-02-25
      • 2015-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多