nginx层实时安全过滤核心是用原生模块在请求到达后端前识别拦截高风险特征,包括uri/参数关键字匹配、请求体长度限制、请求头校验及响应内容脱敏。

直接在 Nginx 层面对请求内容做实时安全过滤,核心思路是:在请求到达后端前,用轻量、低延迟的原生模块识别并拦截高风险特征。它不依赖后端解析,也不需要解包请求体,适合做第一道网关防线。
基于请求 URI 和参数的关键字拦截
这是最常用且高效的方式,适用于防御 XSS 测试载荷、SQL 注入片段、目录遍历等。Nginx 的 rewrite 模块 + if 指令 可快速匹配 URL 中的危险模式:
- 拦截常见 XSS 关键字(不区分大小写):
if ($request_uri ~* "(alert|script|onerror|eval|javascript:|vbscript:)") { return 403; } - 阻断路径遍历尝试:
if ($request_uri ~ "\.\./") { return 403; } - 拒绝含 base64 编码或 PHP 函数调用的参数:
if ($args ~ "(base64_|phpinfo|system\(|exec\()") { return 403; }
注意:避免在高并发 location 中堆叠过多正则;更推荐用 map 指令预计算 提升性能,例如定义 $block_arg 根据 $args 匹配结果设为 1,再统一 if 判断。
限制请求体大小与长度阈值防控
超大请求体(如伪造的 100MB POST)常用于 DoS 或绕过 WAF。Nginx 原生变量 $request_length 是真实接收字节数,不受编码/压缩干扰,最适合做硬性拦截:
- 对非上传接口设严苛上限(如普通 API 不应超过 256KB):
if ($request_length > 262144) { return 413; } - 配合日志分析定位异常源:
在 log_format 中显式记录 $request_length $request_time $upstream_response_time,再用 awk 快速筛查“长请求 + 零后端耗时”组合(说明请求被静态拦截) - 确保 client_max_body_size 设置合理,避免 413 误报;上传接口可单独 location 放宽,并启用 client_body_buffer_size 控制内存缓冲
请求头与客户端行为可信度校验
很多攻击会伪造或滥用请求头,Nginx 可在入口层做基础可信验证:
- 封禁已知恶意 User-Agent:
if ($http_user_agent ~* "(sqlmap|nikto|dirbuster|masscan)") { return 403; } - 校验 Host 头防虚拟主机探测:
if ($host !~ ^(example\.com|www\.example\.com)$) { return 444; }(444 直接断连,不发响应) - 限制 Referer 防盗链或 CSRF 试探:
if ($http_referer !~ "^https?://(example\.com|sub\.example\.com)/") { return 403; } - 防范大头攻击:用 client_header_buffer_size 1k; large_client_header_buffers 4 4k; 控制单个请求头最大占用,超出即 400
响应内容脱敏(反向过滤)
当后端返回敏感信息(如调试数据、环境标识、手机号),可用 sub_filter 模块实时替换,无需修改应用代码:
- 仅处理指定类型响应(必须显式声明):
sub_filter_types text/html text/plain application/json; - 多级替换需注意顺序(长词优先):
sub_filter "prod-api-key-abc123" "***";
sub_filter "test-env" ""; - 若后端启用了 gzip,必须加 gunzip on; 否则 sub_filter 无效
- 不支持正则,如需大小写不敏感或复杂模式,建议交由后端或接入 ModSecurity











