disable_symlinks指令不能在http块中使用,仅支持location或server块,需配合from=指定绝对路径基目录,用于拦截符号链接逃逸,防止静态资源越权访问。

disable_symlinks 是 Nginx 内置的安全机制,不是用来“规避”越权访问的工具,而是主动阻止越权访问的防护指令。它不能“绕过”风险,而是从文件系统访问源头拦截符号链接逃逸行为。正确使用它,才能真正防范软链接引发的静态资源越权(如 /static/../../etc/passwd 类路径穿越)。
为什么软链接会导致静态资源越权?
Nginx 在解析 root 或 alias 路径时,若路径中含符号链接,会自动跟随跳转到目标路径。只要 worker 进程对目标路径有读权限,就可能意外暴露本不应公开的系统文件或敏感目录。
例如:
location /static/ {
alias /var/www/html/static/;
}
若 /var/www/html/static/js 实际是软链接指向 /etc/,请求 /static/js/shadow 就可能读取 /etc/shadow(前提是 nginx 用户有权限)。
正确启用 disable_symlinks 防御越权
该指令只能在 location 或 server 块中使用,且必须配合明确的根路径(from=):
location /static/ {
alias /var/www/static/;
disable_symlinks on from=/var/www/static/;
}
-
on:启用检查 -
from=/var/www/static/:指定可信基目录(必须为绝对路径,末尾斜杠建议保留)
Nginx 会验证:
✅ 请求最终解析出的物理路径是否完全落在 /var/www/static/ 内(包括所有中间软链目标)
❌ 若任一环节跳转到该目录之外(如 /var/www/static/../etc/),直接返回 403 Forbidden
⚠️ 注意:
disable_symlinks对proxy_pass、fastcgi_pass等不生效——它只约束 Nginx 自己读文件的行为(如try_files、alias、root后的路径解析)。
配合使用的必要措施
仅靠 disable_symlinks 不够,还需同步加固:
严格限制软链接所在目录权限
确保 nginx 用户(如www-data)对/var/www/static/及其父目录有r-x,但对/etc/、/home/等敏感路径无任何权限禁用用户创建软链接的能力
在静态资源目录上设置chattr +a(仅追加)或chmod o-w,防止攻击者上传恶意软链避免在 root/alias 中使用相对路径软链
如ln -s ../data/uploads ./uploads,Nginx 解析时以进程工作目录为基准,极易失控。一律用绝对路径创建软链开启 error_log 跟踪检测失败
加入error_log /var/log/nginx/error.log notice;,当disable_symlinks触发拦截时,日志会记录类似:*1 symbolic link is not allowed by disable_symlinks
替代或补充方案(当 disable_symlinks 不可用时)
- 使用
open_file_cache off;避免缓存软链解析结果(治标不治本) - 在
location中用正则拒绝含..的 URI:if ($request_uri ~ "\.\.") { return 403; }(注意:
if在 location 中慎用,优先选map+return) - 应用层校验:PHP 中用
is_link()+realpath()判断并拦截(见safe_file_exists模式) - 容器化部署时,通过挂载只读卷、
chroot或 SELinux 策略从系统层隔离
不复杂但容易忽略










