路径遍历是nginx配置中最易被忽视却后果最严重的风险,防护核心是在请求进入文件系统前切断越界路径,需在server块顶部用if拦截..、编码变体及双斜杠,禁用alias改用root+try_files,统一屏蔽点开头路径与危险后缀,并限制静态资源参数。

路径遍历是Nginx配置中最易被忽视、却后果最严重的一类风险。它不依赖后端代码漏洞,仅靠配置疏漏就可能让攻击者读取/etc/passwd、.env、源码甚至私钥。防护核心不是等日志报警,而是在请求进入文件系统前就切断越界路径。
在入口处直接拦截穿越特征
Nginx的$uri和$request_uri配合使用,能覆盖原始请求与标准化路径两层绕过:
-
if ($uri ~ "\.\.") { return 403; }——拒绝解码后含..的路径 -
if ($request_uri ~ "(\.\.\/|\/\.\.|%2e%2e|\.%2e|\/%2e%2e)") { return 403; }——拦截URL编码变体(如%2e%2e)和混合写法 -
if ($uri ~ "//") { return 403; }——防止双斜杠干扰路径归一化,绕过其他规则
这些if语句必须放在server块顶部、所有location之前,否则可能被后续匹配跳过。
静态资源必须用 root + try_files,禁用 alias
alias不做路径合法性校验,是路径遍历高发区。例如location /static { alias /data/files; }遇到/static/../etc/passwd会拼出/data/filesetc/passwd。
- 改用
location /static/ { root /data; }——location末尾加/,root值末尾不加/ - 强制搭配
try_files $uri =404;,只响应真实存在的文件,不存在即返回404,不回退、不列目录 - 避免
index、autoindex on等可能触发隐式行为的指令
统一屏蔽敏感路径与危险后缀
即使没发生路径穿越,直接访问/.git/config或/backup.sql也足以导致泄露:
- 用
location ~ /\. { deny all; }统一拦截所有以点开头的路径(如/.git/、/.env),放在server块最前 - 补充精确匹配:
location = /.env { return 404; }、location ~ /config\.php$ { deny all; } - 封禁常见危险后缀:
location ~* \.(env|ini|sql|bak|log|conf|sh|py|yml|yaml|xml|swp)$ { return 404; }
所有规则需锚定^/开头,避免误杀/api/v1/config这类正常路径。
限制静态资源参数,防带参穿透
很多攻击通过?file=../etc/passwd或&debug=1绕过路径限制:
- 对图片、JS、CSS等资源,禁止含
cmd、file、path等参数名:if ($request_uri ~* "(\?|&)(cmd|exec|file|path|dir)=|\.%2e|%2e%2e") { return 403; } - 若业务确需参数(如
?v=1.2.3),用白名单机制:set $allowed_args 0;→ 检查$args是否为空或仅含v=、t=等安全格式 → 不匹配则return 403 - 该逻辑必须置于
location块内,且在try_files或root之前执行











