在Virtual Host中配置请求参数过滤,旨在请求抵达后端前拦截含恶意脚本特征的URI、查询参数及请求头;通过if+正则匹配$ args和$request_uri,可分别阻断XSS、SQL注入、base64编码、目录穿越等攻击并返回403。

在 Virtual Host(即 server 块)中配置请求参数过滤,核心目标是**在请求抵达后端前,拦截或清理含恶意脚本特征的 URI、查询参数($args)、请求头等字段**。这不是替代应用层防护,而是轻量、前置、低延迟的第一道网关防线。
直接匹配并拦截高危查询参数
攻击者常把 XSS 或 SQL 注入载荷藏在 URL 参数里,例如 ?q=<script>alert(1)</script> 或 ?id=1%20union%20select。可在 server 块内直接用 if + 正则判断:
- 屏蔽常见 XSS 关键字(不区分大小写):
if ($args ~* "(|%3C|%3E|script|alert|eval|document.cookie|onerror|javascript:|vbscript:)") { return 403; } - 阻断典型 SQL 注入片段:
if ($args ~* "(unions+select|inserts+into|drops+table|load_file|intos+outfile)") { return 403; } - 拒绝 base64 编码或 PHP 危险函数调用:
if ($args ~ "(base64_|phpinfo(|system(|exec(|passthru()") { return 403; }
统一校验整个请求 URI(含路径+参数)
$request_uri 包含原始请求路径和完整查询字符串,适合检测路径遍历、编码绕过等组合攻击:
- 防目录穿越:
if ($request_uri ~ "../|..\\|/etc/passwd|/proc/self/environ") { return 403; } - 防 URL 编码的尖括号:
if ($request_uri ~ "%3C[[:space:]]*script|%3E|<iframe>]*onerror=") { return 403; }</iframe> - 防已知恶意路径:
if ($request_uri ~ "/phpmyadmin|/wp-admin|/adminer.php|/shell.php") { return 403; }
过滤请求头中的脚本注入尝试
User-Agent、Referer、Cookie 等头部也可能携带恶意代码或扫描特征,需同步校验:
- 封禁含 XSS 特征的 UA:
if ($http_user_agent ~* "(|%3C|%3E|script|alert|document.cookie|onload|onmouseover)") { return 403; } - 拒绝空 UA 或工具指纹:
if ($http_user_agent = "" || $http_user_agent ~* "(sqlmap|nikto|curls+.*-Xs+POST|python-requests)") { return 403; } - 限制 Referer 防盗链与 CSRF 探测:
if ($http_referer !~ "^https?://(yourdomain.com|sub.yourdomain.com)/") { return 403; }
提升性能与可维护性的推荐写法
避免在高并发 location 中堆叠多个 if,更推荐用 map 预计算风险标识,在 http 块定义,再在 server 块统一拦截:
- 在
http块中添加:map $args $bad_args {<br> default 0;<br> ~*(<|>|%3C|%3E|script|alert|eval) 1;<br>}map $http_user_agent $bad_ua {<br> default 0;<br> ~*(sqlmap|nikto) 1;<br>} - 在
server块中统一处理:if ($bad_args = 1) { return 403; }<br>if ($bad_ua = 1) { return 403; }
注意:所有规则应放在 server 块顶层或明确的 location / 内;避免在正则中使用过于宽泛的模式(如 .*),防止回溯爆炸;配合 client_max_body_size 和 client_header_buffer_size 控制请求体与头部大小,防止绕过。


















