发布于2026-07-05 阅读(0)
扫一扫,手机访问
先说说核心判断:TinyFileManager 的 root 配置不生效,根源不在配置写错,而在于它默认就没打算帮你做路径隔离。很多同学折腾半天,改了 $root 或 $root_path,一访问发现依然能翻到 /var/www 根目录下的所有文件——这其实不是 bug,而是 TinyFileManager 自身不校验路径,全靠 PHP 的 open_basedir 或系统权限硬扛。少了关键一行配置,等于白搭。

root 配置不生效?常见现象是:在配置里设置了 $root 或 $root_path,可访问时依旧能跳出指定目录,甚至把 /var/www 下的内容全列出来了。根本原因不是配置写错了,而是 TinyFileManager 默认没启用路径隔离机制——它只依赖 PHP 的 open_basedir 或者系统权限做兜底,自己压根不做路径规范化校验。
实操上要注意几点:
tinyfilemanager.php v2.5+),1.x 版本内部没有 root 边界逻辑$root,并且把 $use_open_basedir 设为 true,否则 $root 只是摆设,不拦截越界请求open_basedir 需要在 php-fpm.conf 或站点的 fastcgi_params 里设置;Apache 环境则在 .htaccess 或虚拟主机配置中用 php_admin_value open_basedir 来写scandir() 不越界?别依赖函数本身scandir() 这函数天生就不做路径合法性检查,你传个 ../../../etc 进去,只要 PHP 进程有权限,它就照扫不误。这不是 bug,是设计上的“诚实”——它只负责读目录,不负责判断该不该读。所以真正的防线必须在调用它之前。
实操上可以这样做:
realpath($user_input) 把用户传入的路径转成绝对路径,然后用 strpos() 判断是否以合法的根目录开头:if (0 !== strpos(realpath($path), $allowed_root)) { die('Access denied'); }basename() 或者正则“过滤 ..”来消毒,这两种方法极容易被绕过——像 %2e%2e/、....// 都能轻松绕过简单过滤realpath() 会自动标准化斜杠,省去额外处理即便 $root 配置对了、open_basedir 也生效了,上传或新建文件还是报 Permission denied,那多半是 PHP-FPM 进程的用户(比如 www-data)对目标目录没有写权限,跟代码逻辑没关系。
排查和解决可以从这几个角度入手:
ps aux | grep php-fpm 确认主进程运行的用户,再对照 php-fpm.conf 里的 user 和 group 看 worker 进程是否一致chown -R www-data:www-data /var/www/filemanager/data,权限设 755(目录)和 644(文件),需要写入的子目录单独设 775777——它让所有用户可写,等于把文件管理器的登录密码形同虚设ini_set('open_basedir', $allowed_path) 动态限制是否可靠?不可靠。绝大部分生产环境(尤其是 PHP-FPM 模式)下,open_basedir 是 PHP 主进程启动时就定死的 ini 值,运行时调 ini_set() 根本改不了,只会静默失败——ini_set() 返回 false,连个警告都没有。
正确做法是:
php.ini、php-fpm.conf 或站点配置中静态设置 open_basedir,例如:open_basedir = /var/www/filemanager:/tmp/tmp 必须显式加上,否则临时文件操作会挂掉test.php 执行 echo ini_get('open_basedir');,输出应该是个非空字符串路径边界这事,说到底就是三层防线:PHP 配置层(open_basedir)、代码逻辑层(realpath() 校验)、操作系统层(用户权限)。少一层,就可能被绕过。别指望一个配置项或一个函数就能搞定全部。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8