Nginx 可在反向代理层直接拦截静态资源请求中的非法参数,通过 $request_uri 和 $args 配合正则匹配阻断含 cmd、file、debug 等高危参数名或目录遍历值的请求,优先放行无参或仅含 v=、t= 等白名单参数的请求,并可结合 valid_referers 与参数校验实现双重防护。

直接在 Nginx 层拦截静态资源请求中的非法参数,核心是区分“路径本身合法但带恶意参数”和“参数值明显违规”两类情况。Nginx 不解析 query string 语义,但可通过 $args、$request_uri 和正则匹配做有效过滤,无需依赖后端。
拦截含高危参数名或值的请求
对图片、JS、CSS 等静态资源,若 URL 中出现如 ?cmd=、&debug=1、?file=../etc/passwd 等典型攻击参数,应立即阻断:
- 用
$request_uri匹配原始带参路径,覆盖 URL 编码绕过:if ($request_uri ~* "(\?|&)(cmd|exec|debug|file|path|dir|root)=|\.%2e|%2e%2e|/\.\.") { return 403; } - 单独检查参数值是否含目录遍历特征(更精准):
if ($args ~* "(cmd|file|path)=.*(\.\.|%2e)") { return 403; } - 避免误杀:不匹配
?v=1.2.3这类正常版本参数,正则需锚定等号后内容
限制静态资源仅允许特定参数
多数静态资源本不该接受任何参数。若业务确需少量白名单参数(如 ?v=、?t=),可反向定义安全模式:
- 先放行无参或仅含白名单参数的请求:
set $allowed_args 0;if ($args = "") { set $allowed_args 1; }if ($args ~* "^v=[a-zA-Z0-9._-]+$|^t=\d+$") { set $allowed_args 1; } - 拒绝其余所有带参请求:
if ($allowed_args = 0) { return 403; } - 该逻辑必须放在
location块内,且置于try_files或root指令之前,否则可能被跳过
结合 Referer 与参数做双重校验
某些场景下,非法参数常伴随盗链行为(如外站用 ?token=xxx 绕过 Referer 检查)。可联动防御:
- 对关键静态资源(如用户头像、私有附件),要求既满足 Referer 白名单,又禁止敏感参数:
location ~* \.(jpg|png|pdf)$ {valid_referers none blocked *.myapp.com myapp.com;if ($invalid_referer) { return 403; }if ($args ~* "(token|sig|auth)=") { return 403; }root /data/files;try_files $uri =404;} - 注意顺序:
valid_referers必须在if ($invalid_referer)前,且整个块不能嵌套在其他 if 中
规避常见陷阱
这类拦截易因配置位置或变量作用域失效:
-
$args是解码后的参数字符串,不含 URL 编码;$request_uri是原始未解码串,两者配合能防编码绕过 - 不要在
if内使用proxy_pass或rewrite,Nginx 不支持,会导致配置加载失败 - 所有拦截规则应放在通用
location ~* \.(js|css|png)$块顶层,而非嵌套在更宽泛的location /内 - 测试时用
curl -I "http://site/logo.png?file=../../etc/passwd"验证是否返回 403,而非 404


















