PHP 8.x修复文件包含漏洞的核心是切断用户输入到文件路径的控制链,采用白名单映射、realpath校验、禁用危险配置及函数替代等多重防护措施。

PHP 8.x 中修复文件包含漏洞,核心不是给 include 加补丁,而是彻底切断用户输入到文件路径的控制链。漏洞能被利用,必须同时满足两个条件:路径可控(如 include($_GET['page']))、内容可控(攻击者能在服务器上写入恶意代码)。只要其中一环断开,LFI/RFI 就无法落地。
用白名单映射代替动态拼接
这是唯一可靠的方式。黑名单过滤(比如删 ../、替换 php)在真实场景中基本无效,绕过手法太多:URL 编码、大小写混用、双写、空字节截断等。
- 把合法页面固化为键值对数组:
$pages = ['home' => 'pages/home.php', 'about' => 'pages/about.php', 'contact' => 'pages/contact.php']; - 接收参数后只查表:
$file = $pages[$_GET['page'] ?? ''] ?? 'pages/home.php'; - 匹配失败直接拒绝,不 fallback 到拼接逻辑
强制路径规范化并校验目录范围
即使用了白名单,也要防变量污染或配置错误导致路径逃逸。所有包含前必须做 realpath + 前缀比对。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 调用
realpath($file)获取绝对路径 - 检查是否落在预期目录内:
if (strpos(realpath($file), '/var/www/app/') !== 0) { die('Access denied'); } - 额外加
is_file($file) && is_readable($file)防止符号链接或权限问题
关闭危险配置与协议
代码层防护再严,也挡不住底层执行环境放行。PHP 8.x 默认仍保留部分高危能力,需手动禁用。
立即学习“PHP免费学习笔记(深入)”;
- 在
php.ini中设allow_url_include = Off(禁远程包含) - 限制脚本访问范围:
open_basedir = /var/www/app/:/tmp/ - 禁用非必要流包装器:
stream_wrapper_unregister('phar');、stream_wrapper_unregister('data');、stream_wrapper_unregister('php'); - 敏感目录如
/proc/self/fd/不要放进open_basedir
替换危险函数,改用安全替代方案
尽量避免让用户输入参与任何 include/require 调用。优先使用更可控的机制。
- 模板渲染走 Twig、Blade 等引擎,它们默认沙箱隔离、自动转义
- 多语言文案、配置项等静态内容,改用
json_decode(file_get_contents('config.json')),不执行代码 - 必须动态加载逻辑时,用
spl_autoload_register()实现类自动加载,由命名空间和文件结构约束加载范围


















