PHP 项目如何配置 open_basedir 防止文件包含漏洞利用?

文章导读
配置 open_basedir 是限制 PHP 脚本访问文件系统范围的有效手段,能显著降低文件包含漏洞被利用后的危害,但需注意 PHP 版本兼容性及配置路径的准确性。
📋 目录
  1. 配置前检查
  2. 备份配置文件
  3. 分步配置
  4. 验证是否生效
  5. 常见坑与风险
A A

配置 open_basedir 是限制 PHP 脚本访问文件系统范围的有效手段,能显著降低文件包含漏洞被利用后的危害,但需注意 PHP 版本兼容性及配置路径的准确性。

先说结论:这是一道必要的安全防线,但配置不当会导致网站功能异常,且 PHP 8.4 已计划弃用该特性,建议尽快评估替代方案。

  • 先检查:确认 PHP 版本及运行模式(FPM 或 mod_php)
  • 优先做:修改前备份配置文件,优先在 Web 服务器层面配置
  • 再验证:上传测试脚本确认无法读取系统敏感文件

配置前检查

在修改配置前,需确认当前环境是否支持 open_basedir 及具体的运行模式。

1. 检查 PHP 版本

终端执行以下命令,若版本接近或超过 8.4,需注意该指令可能失效:

PHP 项目如何配置 open_basedir 防止文件包含漏洞利用?
php -v

2. 确认 PHP 运行模式 (SAPI)

不同的运行模式决定了配置文件的修改位置:

php -i | grep "Server API"
  • 若显示 FPM:需修改 PHP-FPM 池配置文件(如 www.conf)。
  • 若显示 Apache 2.0 Handler:可修改 .htaccess 或虚拟主机配置。

3. 获取项目实际根目录

不要凭感觉猜测路径,使用以下方法获取准确路径:

PHP 项目如何配置 open_basedir 防止文件包含漏洞利用?
  • 命令行方式:进入项目目录后运行 pwd
  • PHP 脚本方式:创建临时文件 info.php,内容 <?php echo getcwd(); ?>,浏览器访问获取路径。

备份配置文件

修改配置前务必备份,防止配置错误导致服务无法启动。注意路径中的版本号需根据实际环境调整。

# PHP-FPM 池配置备份
cp /etc/php/8.1/fpm/pool.d/www.conf /etc/php/8.1/fpm/pool.d/www.conf.bak

# Apache 虚拟主机配置备份
cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/000-default.conf.bak

分步配置

  1. 确定必要路径:路径需包含项目根目录及必要的临时目录。查看 php.ini 中 upload_tmp_dirsession.save_path 的位置,通常是 /tmp/var/lib/php/session
  2. 修改配置:根据 SAPI 选择对应方式。
    • Nginx + PHP-FPM:编辑池配置文件(如 /etc/php/8.1/fpm/pool.d/www.conf),添加:
    php_admin_value[open_basedir] = /var/www/html:/tmp
    • Apache + mod_php:可在虚拟主机配置或 .htaccess 中添加:
    php_value open_basedir /var/www/html:/tmp
    • Apache + PHP-FPM:.htaccess 中 php_value 通常不生效,建议在虚拟主机配置中通过 FastCGI 参数设置,或直接修改 FPM 池配置。
  3. 重启服务:修改后重启服务使配置生效。
# 重启 PHP-FPM
systemctl restart php8.1-fpm

# 重启 Apache
systemctl restart apache2

验证是否生效

在网站根目录下创建一个 test.php,内容如下:

<?php
var_dump(file_get_contents('/etc/passwd'));
?>

浏览器访问该文件。如果配置生效,页面应显示 Warning 错误,提示 open_basedir restriction in effect,且无法输出文件内容。

常见坑与风险

  • PHP 版本兼容性:PHP 8.4 版本已宣布弃用 open_basedir,未来版本可能移除,建议结合其他安全措施(如 disable_functions)。
  • 临时目录权限:忘记添加临时目录会导致文件上传或 Session 功能失效。
  • 软连接绕过:早期版本存在通过软连接绕过的风险,确保目录权限设置正确,不要允许用户上传可创建软连接的文件。
  • 命令行脚本:CLI 模式下运行的脚本可能不受 Web 服务器配置影响,需在 php.ini 中单独设置。
  • 配置生效问题:Apache + PHP-FPM 模式下,.htaccess 中的 php_value 通常无效,需检查错误日志确认。