Django 应用程序依赖于主机标头来获取某些链接等。在我的设置中,我有一个 django 应用程序在 nginx 后面运行作为反向代理(使用非默认server_name
)
根据:
https://docs.djangoproject.com/en/3.1/topics/security/#host-header-validation
例如,即使 Apache 配置为你的 Django 网站从设置了 ServerName 的非默认虚拟主机提供服务,HTTP 请求仍然有可能匹配此虚拟主机并提供虚假的 Host 标头
我找不到任何关于是否可以或如何在 nginx 中完成此操作的信息。
在 webapp 中盲目地允许依赖来自 nginx 的标头真的不安全吗?
答案1
要将标头传递Host:
到反向代理应用程序,请将以下内容添加到server
/location
块中:
proxy_set_header Host $host;
最终可能的值取决于 nginx 虚拟主机配置$host
。
如果您的server
块是一个default_server
块,则意味着服务器块将处理发送到任何虚拟主机的任何请求。在这种情况下,Host
标头的值将传播到上游服务器。
为了防止出现这种default_server
情况,请使用此版本:
proxy_set_header Host example.com;
example.com
你的域名在哪里?
更好的方法是正确配置 nginx,以便default_server
块始终返回 404,并使用具有正确名称的适当虚拟主机。