应早识别、快拦截、不转发畸形URL;用$request_uri匹配非法字符(如%00、{、|)、过长URI(>8KB)及SQL/XSS指纹,直接返回403或400。

在 Nginx 的 server 块中处理畸形 URL 请求,核心是“早识别、快拦截、不转发”。不需要等请求进入后端或解析参数,而是在请求路由阶段就基于原始 URI 特征做判断——既防攻击,也保性能。
拦截含非法字符或编码的 URL
URL 中出现未编码空格、花括号 {、竖线 |、尖括号 、空字节 %00 等,基本可判定为畸形或恶意构造。Nginx 可直接用 $request_uri 匹配并阻断:
- 全局拦截空字节(防路径遍历/截断):
if ($request_uri ~ "%00") { return 403; } - 拦截常见非法符号(RFC 7230 不允许):
if ($request_uri ~ "[\{\|\}\^\`\[\]\]") { return 400; } - 拒绝过长 URI(如超 8KB),避免缓冲区耗尽:
if ($request_uri ~ "^.{8192,}") { return 414; }
对已知攻击指纹做精准拦截
SQL 注入、XSS 等常把关键字藏在路径或参数里,比如 /api/user?id=1%20union%20select。可在 server 块中统一匹配 $request_uri:
- 阻断典型 SQL 注入模式:
if ($request_uri ~* "(union\s+select|select\s+\*|insert\s+into|drop\s+table|xp_cmdshell)") { return 403; } - 拦截常见 XSS 载荷:
if ($request_uri ~* "(<script return></script> - 注意:正则加
i标志(即~*)确保大小写不敏感;避免过度宽泛,如单独匹配select易误伤正常词
对畸形请求做安全跳转而非放行
某些场景下需引导用户(如前端调试),但绝不应让异常请求抵达后端。可用 rewrite + return 组合实现可控跳转:
- 将含双斜杠
//的路径重写为单斜杠并 301 跳转(防目录遍历试探):rewrite ^/(.*)//+(.*)$ /$1/$2 permanent; - 对明显错误路径(如带
..且非静态资源)返回 404 或跳转首页:if ($request_uri ~ "\.\./") { return 302 /; } - 慎用
last或break做内部重写——若目标 location 仍可能触发后端逻辑,不如直接return更稳妥
配套加固:从源头压低风险面
仅靠 URI 匹配不够,还需限制请求解析阶段的“容错空间”:
- 收紧请求头缓冲:
client_header_buffer_size 2k;<br>large_client_header_buffers 4 8k;
- 关闭下划线支持(防
X-Api-Key被误作x_api_key绕过):underscores_in_headers off; - 设置请求头超时(防慢速畸形头攻击):
client_header_timeout 5s; - 若启用 HTTP/2,必须同步配置:
http2_max_header_size 32k;<br>http2_max_field_size 4k;


















