防范Nginx路径遍历需从请求解析、路径映射、文件访问三环节拦截:在server块顶层用if+正则拒绝..、编码变体及双斜杠;静态资源改用root+try_files替代有风险的alias;禁用autoindex,正则屏蔽.git等敏感路径前缀;严格限制Nginx进程权限与根目录位置。

防范 Nginx 配置层面的路径遍历隐患,关键在于从请求解析、路径映射、文件访问三环节切断攻击链。不依赖后端、不等待日志告警,让非法路径在 Nginx 路由阶段就被拦截或失效。
用 if + 正则在入口处拒绝典型穿越特征
在 server 块顶层(必须在所有 location 之前)添加以下规则,覆盖原始和编码变体:
-
if ($uri ~ "\.\.") { return 403; }—— 拦截解码后含..的路径 -
if ($request_uri ~ "(\.\.\/|\/\.\.|%2e%2e|\.%2e|\/%2e%2e)") { return 403; }—— 拦截原始请求中各类编码与混合写法 -
if ($uri ~ "//") { return 403; }—— 防止双斜杠干扰路径标准化,绕过其他规则
注意:$uri 是标准化后的路径,$request_uri 是原始未解码字符串,二者配合可防多数绕过手法。
静态资源一律用 root + try_files,禁用 alias
alias 指令存在固有风险:它做的是机械字符串替换,不校验路径合法性。例如 location /static { alias /data/files; } 遇到 /static/../etc/passwd 可能拼出 /data/filesetc/passwd。
- 改用
location /static/ { root /data; try_files $uri =404; } -
root路径末尾不加斜杠,location末尾必须加斜杠(如/static/),确保物理路径严格限定在/data/static/下 -
try_files $uri =404强制只响应真实存在的文件,不存在即 404,不回退、不列目录、不暴露结构
显式关闭 autoindex 并屏蔽敏感路径前缀
即使路径没被穿越,直接请求敏感文件仍会造成泄露:
- 全局禁用目录列表:
autoindex off;(放在 server 或 http 块中) - 统一拦截高危路径前缀,在 server 块顶部加:
该正则以 ^/ 锚定开头,避免误杀正常路径中的子串;且必须置于通用 location(如 location ~ \.php$)之前,防止被覆盖。
权限与部署细节不可忽略
- Nginx 工作进程用户(如
www-data)不应拥有对系统目录或应用配置目录的读取权限 - Web 根目录(
root指向的路径)不能是系统根分区(如/、C:/)或父级目录 - Windows 环境下路径统一用正斜杠
/,反斜杠\会导致配置校验失败 - 每次修改后执行
nginx -t校验语法,再nginx -s reload生效


















