php伪协议文件包含漏洞修复核心是切断用户输入与include函数的直接通路,禁用高危协议、强制路径白名单、规范文件上下文;需映射合法页面为预定义键值对、禁用allow_url_include、标准化路径并限定根目录、改用安全加载方式。

PHP伪协议文件包含漏洞的修复核心是:**切断用户输入与include类函数的直接通路,同时禁用高危协议、强制路径白名单、规范文件上下文**。伪协议(如php://filter、data://、phar://)本身不是漏洞,但它们被攻击者利用的前提,是程序把不受控的用户参数直接喂给了include或require——修复必须从这个源头堵死。
严格校验文件名,只允许白名单内值
不要拼接路径,更不要直接使用$_GET['file']等变量。应将所有合法页面/模块映射为预定义键值对,用户只能传“名字”,不能传“路径”。
- 用关联数组建立安全映射:
$pages = ['home' => 'home.php', 'about' => 'about.php', 'contact' => 'contact.php']; - 接收参数后仅做键存在性判断:
$page = $_GET['page'] ?? ''; if (!isset($pages[$page])) { die('Invalid page'); } - 最后包含固定路径:
include('pages/' . $pages[$page]);
禁用危险协议,关闭远程包含能力
PHP默认禁用allow_url_include,但老项目或测试环境可能开启。必须确保该配置为Off,并验证生效。
- 在
php.ini中设置:allow_url_include = Off,同时确认allow_url_fopen = Off(减少攻击面) - 若无法改全局配置,可在代码开头强制关闭:
ini_set('allow_url_include', '0');(注意:需在include调用前执行) - 检查是否启用
php://filter等伪协议读取源码的能力——这不是靠禁用协议实现的,而是靠不让用户控制include目标来规避
路径规范化与前缀强制绑定
即使做了白名单,也要防止绕过(如通过../跳转到非预期目录)。所有动态路径都应经过标准化处理,并限定根目录范围。
- 使用
realpath()解析路径后,检查是否仍在允许目录内:$full = realpath('pages/' . $page); if (strpos($full, dirname(__FILE__) . '/pages/') !== 0) { die('Access denied'); } - 避免用
basename()简单截取文件名——它不防../../../etc/passwd%00这类构造 - 统一添加固定前缀,禁止相对路径穿越:
include('pages/' . preg_replace('/[^a-z0-9_\-]/i', '', $safe_name) . '.php');
替换include逻辑,改用更安全的加载方式
对于语言包、模板、插件等场景,优先考虑不执行代码的加载方式,或由框架接管路径控制。
- 读取配置或静态内容时,用
file_get_contents()+json_decode()代替include - 模板渲染改用Twig、Smarty等成熟引擎,它们默认隔离执行上下文
- 插件系统采用命名空间自动加载(Composer autoloader),而非手动
include文件
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











