nginx 中 proxy_set_header 不过滤请求头,安全需主动清除/禁止透传/替换高风险头;应锁定 host 为 $proxy_host 或固定值,清空 x-forwarded-host/port、authorization、user-agent 等,注入 x-request-id 和 x-forwarded-by,并关闭 underscores_in_headers。

在 Nginx 中,proxy_set_header 本身不“过滤”请求头,也不校验或拦截恶意头;它只负责设置或覆盖发往后端的请求头。所谓“安全过滤”,本质是**主动清除、禁止透传、用可信值替代**,切断攻击者通过伪造请求头(如 Host、X-Forwarded-For、Origin、Authorization 等)误导后端、绕过鉴权或触发漏洞的路径。
锁定 Host 头,阻断域名劫持入口
Host 是最常被用于注入攻击的头,后端若依赖它做租户路由、重定向生成或日志归类,而你又原样透传,就等于开放了攻击通道。
- 绝对禁用:
proxy_set_header Host $host;和proxy_set_header Host $http_host; - 推荐写法:
proxy_set_header Host $proxy_host;(取自proxy_pass地址,天然可信) - 单后端场景可固定:
proxy_set_header Host api.internal; - 确认后端无需 Host 时,可清空:
proxy_set_header Host "";(需实测兼容性)
清空或重写易伪造的代理类头
X-Forwarded-* 类头若被客户端直接构造,极易导致 IP 伪造、协议误判、无限跳转等安全问题。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 用真实连接 IP 替代:
proxy_set_header X-Real-IP $remote_addr; - 不拼接原始值:
proxy_set_header X-Forwarded-For $remote_addr;(而非$proxy_add_x_forwarded_for) - 明确协议类型:
proxy_set_header X-Forwarded-Proto $scheme; - 彻底清除高风险头:
proxy_set_header X-Forwarded-Host "";、proxy_set_header X-Forwarded-Port "";
剥离无业务价值但高风险的客户端头
这些头对后端无用,却可能泄露指纹、触发调试逻辑、或被用作 HTTPoxy 等链式攻击的跳板。
- 清空凭证类头:
proxy_set_header Authorization "";(双引号不可省) - 隐藏设备信息:
proxy_set_header User-Agent ""; - 移除来源标识:
proxy_set_header Referer "";、proxy_set_header Origin ""; - 禁用 Proxy 相关头:
proxy_set_header Proxy "";、proxy_set_header Proxy-Connection "";
统一注入可信上下文,避免依赖客户端输入
让后端只信任 Nginx 显式提供的信息,而不是自行解析不可控的原始头。
- 强制注入唯一请求 ID:
proxy_hide_header X-Request-ID; proxy_set_header X-Request-ID $request_id; - 添加网关身份标识:
proxy_set_header X-Forwarded-By "nginx-gateway"; - 禁用下划线解析(防绕过):
underscores_in_headers off; - 若用 FastCGI,还需补充:
fastcgi_param HTTP_PROXY "";等环境变量清理










