修复php文件包含漏洞的核心是切断用户输入与include/require的直接连接,须用白名单校验、路径规范化、禁用远程包含及重构动态包含逻辑。

修复 PHP 文件包含漏洞,核心是**切断用户输入与 include/require 函数的直接连接**。不能靠简单替换或模糊过滤,必须用结构化手段控制路径来源、规范路径行为、关闭危险能力。
严格使用白名单校验文件名
这是最可靠、最推荐的第一道防线。禁止任何用户输入直接拼接进包含路径,只允许预定义的合法值。
- 把所有可被包含的页面、模板、语言包等,硬编码为数组键值,例如:
$valid_pages = ['home', 'about', 'contact', 'privacy']; - 接收参数后,用
in_array()或array_key_exists()严格比对,不匹配立即中止:if (!in_array($_GET['page'], $valid_pages)) { die('Invalid page'); } - 拼接路径时只使用白名单中的值,不拼接后缀或路径分隔符,避免绕过:
include('pages/' . $_GET['page'] . '.php');→ 改为include('pages/' . $safe_page . '.php');
强制路径规范化与合法性检查
即使做了白名单,也要防止路径穿越(如 ../../etc/passwd)或非法协议(如 php://filter)混入。
- 用
realpath()获取绝对路径,再判断是否落在预期目录内:$abs_path = realpath('pages/' . $user_input . '.php');<br>if ($abs_path === false || strpos($abs_path, '/var/www/html/pages/') !== 0) { die('Access denied'); } - 手动剥离点号和斜杠前缀,或用正则严格限制格式:
if (!preg_match('/^[a-zA-Z0-9_\-]+$/i', $user_input)) { die('Invalid filename'); } - 禁用空字节、URL 编码等常见绕过手法,可用
urldecode()+str_replace()清理后再校验。
关闭远程包含与危险协议
从配置层堵死 RFI 和伪协议利用路径,属于“兜底型”加固,尤其适用于老项目无法快速改代码的场景。
- 确保
allow_url_include = Off(不是 justallow_url_fopen),在 php.ini 或 .htaccess 中显式设置; - 禁用高危流封装器,如在 php.ini 中添加:
disable_functions = "phpinfo,system,exec,passthru,shell_exec,proc_open,parse_ini_file,show_source"; - 配合
open_basedir限制脚本只能访问指定目录,防止跳出根路径读取系统文件。
避免动态包含,优先重构逻辑
很多漏洞源于设计阶段的便利性妥协。修复不只是补洞,更是推动架构升级。
- 用路由分发替代文件名拼接:统一入口(如 index.php),根据 URL 解析出控制器+动作,再 require 对应类文件;
- 模板渲染改用 Twig、Blade 等安全模板引擎,它们默认不执行任意 PHP 代码;
- 配置、语言包等静态资源,改用 JSON/YAML 格式 +
json_decode()加载,彻底避开 include 执行风险。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











