修复PHP文件包含漏洞需切断用户输入到include/require的通路,严格白名单校验、禁用远程协议、路径规范化验证及代码重构消除动态包含。

修复PHP文件包含漏洞,核心是切断“用户输入 → include/require函数”的直接通路。不能靠简单替换或模糊过滤,必须用结构化手段控制路径来源和合法性。
严格使用白名单校验
所有动态包含的文件名,必须从预设的、硬编码的白名单中匹配,不接受任何外部拼接或推导。
- 把合法页面名写成数组,如
$valid_pages = ['home', 'about', 'contact']; - 用
in_array()判断用户传入值是否在其中,严格区分大小写和类型 - 匹配通过后,再拼接固定路径和扩展名,例如
include('pages/' . $page . '.php'); - 禁止任何形式的路径穿越符号(如
../)、协议前缀(如php://)出现在白名单项里
禁用远程包含与危险协议
即使代码层做了白名单,也要关闭底层支持,形成配置层兜底。
- 将
allow_url_include设为Off(默认已是关闭,但需确认) - 同时确保
allow_url_fopen也关闭,防止被其他函数间接利用 - 在
php.ini中设置:allow_url_include = Off;虚拟主机无法改ini时,可用.htaccess(Apache)或user.ini(PHP-FPM)覆盖 - 检查是否启用了
phar://data://等伪协议,必要时通过disable_functions禁用
路径规范化与存在性验证
对必须保留一定灵活性的场景(如多语言包加载),要在白名单基础上加一层路径安全校验。
立即学习“PHP免费学习笔记(深入)”;
- 用
realpath()获取绝对路径,再用strpos()确认是否落在预期目录内,例如:if (strpos(realpath($file), '/var/www/app/lang/') === 0) - 调用
is_file()和is_readable()双重检查,避免路径穿越后指向非法位置 - 禁止用户输入中出现
..、/、:、\等字符,用str_replace()或正则清理后仍需走白名单逻辑
重构代码,消除动态包含需求
最彻底的修复,是让include不再依赖运行时变量。
- 用路由分发代替文件名跳转,例如用
switch($_GET['action'])调用对应函数,而非include - 模板渲染改用成熟引擎(如Twig、Smarty),它们天然隔离执行上下文
- 配置类、语言包等静态资源,统一由中心化加载器管理,路径由内部映射表决定
- 删除项目中所有形如
include($_GET['xxx'])、require($user_input)的代码,审计时重点搜索include(、require(、include_once(、require_once(



















