核心是确认关键头部是否被正确覆盖、清除或限制:Host头须锁定为$proxy_host或固定值,X-Real-IP需设为$remote_addr,禁用$host/$http_host透传,清除Proxy/Origin等高危头,并确保X-Forwarded-Proto和X-Request-ID可信可控。

验证 Nginx 反向代理的请求头安全性,核心是确认关键头部是否被正确覆盖、清除或限制,而不是简单检查“有没有转发”。重点在于后端收到的头是否可信、可控、无污染。
检查 Host 头是否被锁定
Host 头若透传客户端输入,极易引发域名劫持、开放重定向或租户路由混淆。验证方法:
- 用 curl 发起带恶意 Host 的请求:curl -H "Host: evil.com" http://your-proxy/api/test,再查看后端日志或响应中实际收到的 Host 值
- 正确配置应使后端始终收到 $proxy_host(如 api.internal)或固定值,而非 evil.com
- 禁用
proxy_set_header Host $host和proxy_set_header Host $http_host,这两项必须删除
确认真实客户端 IP 是否可靠传递
后端依赖 IP 做限流、封禁或日志归因时,若 X-Forwarded-For 被伪造就完全失效。验证要点:
- 在 Nginx 配置中启用 set_real_ip_from + real_ip_header X-Forwarded-For(仅对可信上游有效)
- 确保 proxy_set_header X-Real-IP $remote_addr,且 X-Forwarded-For 设为 $remote_addr(非
$proxy_add_x_forwarded_for) - 用 curl 模拟多层代理:curl -H "X-Forwarded-For: 1.2.3.4, 5.6.7.8" http://your-proxy/,后端应只看到你的真实出口 IP,而非 1.2.3.4
排查高危头是否被清除
某些头如 Proxy、Origin、User-Agent 若未清理,可能触发 HTTPoxy、CORS 绕过或环境变量污染。验证方式:
- 发起含 Proxy 头的请求:curl -H "Proxy: http://attacker.com" http://your-proxy/,后端 PHP 或 Node.js 进程不应读到 HTTP_PROXY 环境变量
- 检查 Nginx 配置中是否有 proxy_set_header Proxy ""、proxy_set_header Origin ""、proxy_set_header User-Agent ""
- 对 FastCGI 后端,还需确认 fastcgi_param HTTP_PROXY "" 等参数已设置
验证协议与请求 ID 是否统一注入
HTTPS 终止后,后端需明确知道原始协议;链路追踪需防伪造 ID。验证操作:
- 用 HTTPS 访问代理地址,检查后端收到的 X-Forwarded-Proto 是否为 https(而非空或 http)
- 发送带 X-Request-ID: fake-id-123 的请求,后端应忽略该值,收到的是 Nginx 生成的新 ID(如通过
proxy_set_header X-Request-ID $request_id;) - 确认未启用 underscores_in_headers on,避免 X_User_ID 被误解析为危险头











