Nginx请求头安全防护核心是主动控制、显式覆盖、严格校验:一、用default_server拦截非法Host;二、反向代理时用$proxy_host等可信值重写Host;三、正则过滤UA/Referer/Cookie;四、用map预计算提升性能。

在 nginx.conf 中配置请求头过滤防范恶意注入,核心不是“逐个删除可疑头”,而是**主动控制、显式覆盖、严格校验**——用可信值替代不可信输入,从路由层就切断攻击链路。
一、拦截非法 Host 头(防虚拟主机劫持)
Host 头是攻击者最常伪造的字段,用于绕过域名白名单、触发调试接口或污染缓存。必须在请求路由阶段就拦截:
- 在
http块外或http块顶部定义一个兜底server,监听 80/443 并标记为default_server - 不写
server_name,只加return 444;(静默断连)或return 403;(明确拒绝) - 所有业务
server块必须显式列出合法域名,例如:server_name example.com www.example.com api.example.com;
这样,Host: 127.0.0.1、Host: evil.com 或空 Host 请求根本不会进入你的业务逻辑。
二、重写并限制转发的 Host 头(防后端被欺骗)
当 Nginx 作反向代理时,绝不能透传原始 Host。否则攻击者 curl -H "Host: attacker.net" 就可能让后端生成错误跳转或日志路径:
- 禁用风险写法:
proxy_set_header Host $host;或proxy_set_header Host $http_host; - 推荐写法(任选其一):
•proxy_set_header Host $proxy_host;(取自proxy_pass地址,天然可信)
•proxy_set_header Host backend.example.com;(固定可信域名)
•proxy_set_header Host "";(后端完全不依赖 Host 时可清空,需确认兼容性)
三、过滤高危请求头内容(UA / Referer / Cookie)
User-Agent、Referer、Cookie 等头可能携带 XSS、SQL 注入片段或扫描特征,需正则匹配拦截:
- 封禁含脚本关键字的 UA:
if ($http_user_agent ~* "(%3C|%3E|script|alert|document\.cookie|onerror|onload)") { return 403; } - 拒绝已知扫描工具 UA:
if ($http_user_agent ~* "(sqlmap|nikto|curl|wget|python-requests)") { return 403; } - 限制 Referer 防盗链或 CSRF 探测(可选):
if ($http_referer !~ "^https?://(example\.com|www\.example\.com)/") { return 403; } - 注意:避免在
location外大量使用if;更优做法是用map提前标记风险再统一判断(见下条)
四、用 map 预计算提升性能与可维护性
相比嵌套多个 if,map 在请求解析初期就完成匹配,开销更低、逻辑更清晰:
- 在
http块中定义:
map $http_user_agent $is_malicious_ua {
default 0;
~*"(?i)(%3c|%3e|script|alert|eval|document\.cookie|onerror|onload)" 1;
~*"(?i)(sqlmap|nikto|dirbuster|masscan)" 1;
}
map $http_referer $is_bad_referer {
default 0;
~*"(?i)evil\.com|attacker\.net" 1;
}- 在
server或location中统一拦截:if ($is_malicious_ua = 1) { return 403; }<br> if ($is_bad_referer = 1) { return 403; }


















