nginx 通过 proxy_set_header 主动控制上游可见客户端特征以绕过下游简单安全校验,需确认后端真实依赖该头、设置合法值、清除原始干扰头,并确保仅用于授权场景。

利用 Nginx 的 proxy_set_header 修改请求头来绕过下游安全校验,本质是**在代理层主动控制上游可见的客户端特征**,而非“欺骗”或“攻击”。前提是目标后端确实依赖特定头部(如 Referer、Origin、User-Agent 或自定义 Token 头)做简单校验,且未结合签名、IP、会话等多重验证。操作必须可控、可审计,并仅用于合法授权场景(如内部联调、白名单集成)。
确认后端是否真依赖该 Header
盲目修改无效,先验证校验逻辑是否存在:
- 用
curl -H "Referer: fake.com" https://your-proxy/path测试返回是否为 403/401;再试空 Referer、合法 Referer 对比响应差异 - 检查响应头是否有
X-Protected-By: Referer或文档注明校验字段 - 注意部分服务同时校验
Origin、User-Agent或 URL 签名,单改一个头可能不生效
用 proxy_set_header 固定设置合法值
在 location 块中显式覆盖,确保值在对方白名单内:
-
proxy_set_header Referer "https://trusted-domain.com/";(结尾斜杠和协议不能省) -
proxy_set_header Origin "https://trusted-domain.com";(Origin 无尾部斜杠) -
proxy_set_header X-API-Key "valid-key-123";(适用于简单 Token 校验) - 所有
proxy_set_header指令必须写在proxy_pass之前,否则不生效
按条件动态伪装(map + 变量)
当不同路径或域名需不同头部时,用 map 提前定义规则:
- 在
http块中定义:map $host $upstream_referer {<br> app.example.com "https://app.example.com/";<br> admin.example.com "https://admin.example.com/";<br> default "https://fallback.com/";<br>} - 在
location中使用:proxy_set_header Referer $upstream_referer; - 支持正则匹配,例如:
map $http_user_agent $ua_category { ~*curl "cli"; ~*Chrome "browser"; }
清除原始头部防干扰
避免客户端传来的非法值影响判断:
- 清空原始 Referer:
proxy_set_header Referer "";(双引号不可省) - 禁用透传风险头:
proxy_set_header Authorization "";、proxy_set_header Cookie ""; - 移除危险头:
proxy_hide_header X-Powered-By;、proxy_hide_header Server;











