PHP 5.5文件包含漏洞加固需从代码层和配置层双管齐下:禁用用户输入拼接路径,改用白名单映射;关闭allow_url_include、allow_url_fopen,设置open_basedir;统一过滤输入并监控异常包含行为。

PHP 5.5 文件包含漏洞的加固,核心不是“打补丁”,而是切断“用户输入直接拼接路径”这条高危链路。这个版本已停止维护(自2016年起),不再接收安全更新,所以单纯升级 PHP 版本不可行,必须从代码层和配置层双管齐下。
严格限制包含路径来源
所有 include、require 及其 _once 变体,禁止直接拼接 $_GET、$_POST、$_REQUEST 等超全局变量。哪怕加了后缀或目录前缀,也极易被绕过(如 ?page=../../etc/passwd%00 或伪协议注入)。
- 改用白名单映射:将合法页面名硬编码为键值对,用户只传标识符,服务端查表取真实路径
- 禁用动态拼接:删除类似
include 'pages/' . $_GET['p'] . '.php';这类写法 - 若必须支持多语言/模板切换,把文件名限定在固定目录内,并用
basename()剥离路径字符,再拼接绝对路径
关闭危险配置项
PHP 5.5 默认仍可能开启高风险选项,需手动在 php.ini 中关闭:
-
allow_url_fopen = Off—— 阻断远程协议(http://、ftp://)读取 -
allow_url_include = Off—— 关键!彻底禁用远程文件包含(RFI)能力 -
open_basedir = /var/www/html/:/tmp/—— 限制脚本能访问的文件系统范围,防止跳出根目录 -
disable_functions = include, require, include_once, require_once不推荐——会破坏正常功能;应改用代码逻辑控制,而非禁用函数本身
启用基础过滤与日志监控
即使做了白名单,也要防御绕过和异常行为:
立即学习“PHP免费学习笔记(深入)”;
- 对所有传入的文件参数,统一调用
filter_var($input, FILTER_SANITIZE_ENCODED)或正则校验(如/^[a-z0-9_\-]{2,20}$/i) - 记录所有包含操作的请求参数、时间、IP,一旦出现
..、php://、zip://、phar://等关键词立即告警 - 检查 Web 服务器日志中是否频繁访问
access.log、error.log、session文件路径,这是 LFI 利用常见痕迹
替换老旧模式,转向安全范式
PHP 5.5 项目往往伴随旧框架(如 ThinkPHP 3.x、Discuz! X2/X3),建议逐步迁移:
- 用路由分发替代文件名驱动:如
?page=dashboard改为/dashboard,由前端控制器统一调度 - 模板渲染改用安全引擎(如 Twig),禁用原生
include在模板中执行 - 配置加载改用 JSON/YAML 文件 + 白名单解析,避免
include 'config/' . $env . '.php'



















