Nginx 应主动用 proxy_set_header 覆盖高风险头而非过滤非法头;必须重写 Host 为 $proxy_host 或固定值,同步规范 X-Forwarded-* 头,禁用下划线解析,并剥离 User-Agent、Referer、Origin 等危险头。

不能“强制覆盖非法请求头”,Nginx 本身不校验请求头是否“非法”;真正有效的方式是:**主动用 proxy_set_header 覆盖高风险头,切断攻击链路**。关键不是过滤输入,而是拒绝透传不可信值。
必须重写 Host 头
Host 是最常被滥用的入口。攻击者可构造 Host: evil.com,若后端无白名单校验,可能引发跳转、日志注入或租户混淆。
- ❌ 错误写法(透传客户端值):
proxy_set_header Host $host;或proxy_set_header Host $http_host; - ✅ 推荐写法(使用上游地址):
proxy_set_header Host $proxy_host;—— 值来自proxy_pass,天然可信 - ✅ 单域名场景可固定:
proxy_set_header Host api.example.com; - ✅ 极简场景可清空:
proxy_set_header Host "";(需确认后端不依赖 Host)
同步规范 X-Forwarded-* 类头
这些头若被客户端伪造,会误导后端判断真实来源或协议。
- 用
$remote_addr替代$http_x_forwarded_for:proxy_set_header X-Real-IP $remote_addr;、proxy_set_header X-Forwarded-For $remote_addr; - 显式声明协议:
proxy_set_header X-Forwarded-Proto $scheme; - 禁用下划线解析(防
X_User_ID被误作X-User-ID):underscores_in_headers off;
主动剥离无用或危险请求头
某些头对后端无业务价值,却可能暴露指纹或被用于绕过限制。
- 清空 User-Agent:
proxy_set_header User-Agent ""; - 移除 Referer(如无需来源追踪):
proxy_set_header Referer ""; - 禁用 Origin 透传(防 CORS 配置被绕过):
proxy_set_header Origin ""; - 极严格场景可关闭全部头透传:
proxy_pass_request_headers off;
验证是否生效
配置后必须实测,不能只看语法。
- 用 curl 模拟恶意请求:
curl -H "Host: attacker.net" -v https://your-domain.com/health - 检查后端 access log 中的
$host字段,确认始终是你设定的值(如api.example.com),而非attacker.net - 在后端打印收到的请求头,比对原始 Host、X-Forwarded-Proto、X-Real-IP 是否符合预期











