核心是主动控制host头而非过滤,须用proxy_set_header host显式设为可信值(如$proxy_host或固定域名),禁用$host/$http_host透传,并配合default_server拦截非法host请求。

核心不是“过滤”,而是主动控制——用 proxy_set_header Host 覆盖不可信输入,切断攻击链路。Host 头被滥用后,可能引发重定向跳转、日志注入、租户混淆甚至缓存污染,而 Nginx 本身不校验头内容,只负责转发或重写。真正的防护靠你显式指定可信值。
必须重写 Host 头,禁用原样透传
客户端可任意构造 Host: attacker.com,若后端未做白名单校验,风险立即触发。以下写法一律禁止:
proxy_set_header Host $host;proxy_set_header Host $http_host;
推荐方案(按场景选择):
- 使用上游地址(最推荐):
proxy_set_header Host $proxy_host;—— 值来自proxy_pass,如http://backend:8080,天然可信 - 单域名后端可固定:
proxy_set_header Host api.example.com; - 后端完全不依赖 Host 时可清空:
proxy_set_header Host "";(需确认兼容性)
同步规范 X-Forwarded-* 等易伪造头部
仅处理 Host 不够,X-Forwarded-For、X-Forwarded-Proto 等同样常被利用:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 用真实 IP 替代伪造链:
proxy_set_header X-Real-IP $remote_addr;和proxy_set_header X-Forwarded-For $remote_addr; - 明确协议类型:
proxy_set_header X-Forwarded-Proto $scheme; - 禁用下划线解析:
underscores_in_headers off;,防止X_User_ID被误当作X-User-ID
主动剥离高风险请求头
某些头对后端无用,却可能暴露信息或干扰逻辑:
- 清空 User-Agent:
proxy_set_header User-Agent ""; - 移除 Referer(若业务无需):
proxy_set_header Referer ""; - 禁用原始 Origin:
proxy_set_header Origin "";,改由 Nginx 控制 CORS 响应 - 极端严格场景可关闭全部透传:
proxy_pass_request_headers off;
配合 default_server 拦截非法 Host 请求
这是第一道防线,发生在请求路由阶段,比代理层更前置:
- 定义一个
default_server块监听 80/443,server_name _; - 所有未匹配
server_name的请求(如 IP 访问、Host: evil.com、空 Host)直接返回return 403;或静默断连return 444; - 主业务 server 必须显式列出全部合法域名:
server_name example.com www.example.com api.example.com;
验证是否真正生效
配置完必须实测,不能只看语法正确:
- 用 curl 模拟攻击:
curl -H "Host: attacker.net" -v https://your-domain.com/health - 检查后端 access log 中的
$host和$http_host字段,确认始终是你设定的值 - 观察响应头是否已隐藏
Server、X-Powered-By等敏感信息(配合proxy_hide_header)










