Ubuntu下Apache2中PHP脚本无法识别上级目录问题排查
问题根因
脚本无法识别上级目录是open_basedir配置的安全限制导致的,和文件系统权限无关。
PHP的open_basedir是路径访问白名单机制,开启后所有文件系统操作相关函数(包括realpath()、文件读写、目录遍历类函数)只能访问白名单内明确列出的路径,访问白名单外的路径时会直接返回空、false,或者抛出权限错误,和运行脚本的系统用户实际权限没有关系。
你当前的open_basedir配置值为/var/www/www-root/data:.,白名单仅包含两个路径:
.:PHP脚本当前运行的工作目录/var/www/www-root/data:你配置的站点数据根目录
你测试代码里的realpath('..')、realpath(__DIR__. '/../')解析后指向的是当前目录的上级路径,不在上述白名单范围内,因此PHP直接拦截了路径解析请求,返回空字符串,和你观测到的返回结果完全吻合:
header('X-Real-Path1: ' . realpath('..')); // 越界,返回空字符串 header('X-Real-Path2: ' . realpath('.')); // 在白名单内,返回当前目录真实路径 header('X-Real-Path3: ' . realpath(__DIR__)); // 在白名单内,返回当前目录真实路径 header('X-Real-Path4: ' . realpath(__DIR__. '/../')); // 越界,返回空字符串
处理方案
根据你的实际业务需求二选一即可:
- 若业务确实需要脚本访问上级目录内容:修改
open_basedir配置,将需要访问的上级路径追加到白名单中。例如需要允许访问/var/www/www-root目录,就将配置值调整为/var/www/www-root/data:/var/www/www-root:.,修改完成后执行systemctl restart apache2重启Apache服务使配置生效。 - 若无访问上级目录的业务需求:保持现有配置即可。
open_basedir是PHP层面的安全防护机制,作用是避免脚本出现安全漏洞时,攻击者越权访问服务器上的敏感文件(比如系统配置、其他站点的代码和数据),无特殊需求不建议随意放宽路径限制。
注意:调整
open_basedir时尽量只添加业务必须的最小范围路径,不要直接把配置改成根目录/,否则会完全失去这个安全机制的防护作用。
内容的提问来源于stack exchange,提问作者gisly
相关产品推荐
相关产品推荐

