【问题标题】:Django CSRF "Referer Malformed"... but it isn'tDjango CSRF“Referer Malformed”……但事实并非如此
【发布时间】:2021-08-07 01:06:17
【问题描述】:

我正在尝试测试在开发模式下运行良好的 Django 设置的部署配置。

我通过负载平衡器上的 Nginx 的 ssl_preread 模块进行基于名称的路由,并且 SSL 终止于服务器本身的另一个 Nginx 实例,请求通过套接字代理到 uwsgi。

server {
    server_name dev.domain.net;
    listen 80 proxy_protocol;
    listen [::]:80 proxy_protocol;
        location / {
            return 301 https://$host$request_uri;
        }
}
server {
    server_name dev.domain.net;
    listen 443 ssl;
    listen [::]:443 ssl;
    location / {
        include uwsgi_params;
        uwsgi_pass unix:/run/uwsgi/website.sock;
    }
    location /favicon.ico {
        access_log off; log_not_found off;
    }
}

我已将 uwsgi 设置为记录 %(host)%(referer),它们在日志中匹配。

在我的 uwsgi_params 中,我像这样传递 $host$referer,因为我使用基于名称的路由,所以我选择了触发 Nginx 响应的 $server_name 变量...

uwsgi_param  HTTP_REFERER       $server_name;
uwsgi_param  HTTP_HOST          $host;

向这些添加(或删除)协议和端口没有任何区别。可以预见,将它们带走会产生 Django ALLOWED_HOSTS 调试错误。

我已确认我的ALLOWED_HOSTS 包含$host。我尝试为相同的$host 变量添加CSRF_TRUSTED_ORIGINS。我尝试将CSRF_COOKIE_DOMAIN 设置为相同的$host 变量。根据文档建议,我将 CSRF_COOKIE_SECURE 设置为 True。

无论使用上述设置的哪种组合,我都得到:

Referer checking failed - Referer is malformed. 用于所有 POST 请求。

【问题讨论】:

    标签: django nginx csrf uwsgi referer


    【解决方案1】:

    简短回答:不要使用 uwsgi unix 套接字,而是使用 http-socket 并通过未加密的 http(在 uwsgi ini 文件中)将代理请求发送到 localhost:

    http-socket = 127.0.0.1:8001
    

    在 nginx 中,去掉 uwsgi 代理参数,只需启用 proxy_pass 并启用 proxy_protocol 标头:

    server {
        server_name dev.domain.net;
        listen 443 ssl proxy_protocol;
        listen [::]:443 ssl proxy_protocol;
        location / {
            proxy_pass http://127.0.0.1:8001;
        }
        location /favicon.ico {
            access_log off; log_not_found off;
        }
    }
    

    此时,您可以启用 Django 文档中所有推荐的部署设置,明确声明您的 ALLOWED_HOSTS,一切正常。

    这是一系列非常愚蠢的圈套,没有明显的正确答案,尤其是考虑到引用者是很容易伪造的客户端标头。

    更好的答案是 Django 需要在其 CSRF 机制中摆脱客户端引用检查,这是没有意义的,没有意义......

    【讨论】:

      猜你喜欢
      • 2021-01-18
      • 1970-01-01
      • 2015-09-26
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      • 2018-09-22
      • 1970-01-01
      • 2021-05-19
      相关资源
      最近更新 更多