php 8.5.12 仅修复 cve-2026-109618 和 cve-2026-109619 两个 rce 漏洞,不修复 lfi;lfi 是代码逻辑漏洞,需通过白名单、路径校验和 open_basedir 等配置主动防御。

PHP 8.5.12 本身不修复本地文件包含(LFI)漏洞——它只修复两个高危 RCE 漏洞(CVE-2026-109618 / CVE-2026-109619),而 LFI 是代码层问题,必须靠你改代码、调配置来解决。
为什么升级到 PHP 8.5.12 后 LFI 还在?
PHP 版本升级 ≠ 自动堵住所有漏洞。LFI 的根源是代码里用了 include、require 等函数直接拼接用户输入,比如 include($_GET['file'])。PHP 解释器照常执行这行代码,不管输入多危险。8.5.12 只修复了底层内存状态管理缺陷,不影响你写的这行逻辑。
常见误判场景:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 看到“紧急安全更新”就以为所有漏洞都修了
- 升级后没重测 LFI 功能点,误以为已免疫
- 把
allow_url_include = Off当成 LFI 防御,其实它只关 RFI,对../../etc/passwd这类本地路径完全无效
真正能拦住 LFI 的三道硬防线
必须同时做,缺一不可:
-
代码层白名单:彻底弃用动态拼接。用关联数组映射合法参数值到绝对路径,例如:
$whitelist = ['home' => '/var/www/app/views/home.php', 'about' => '/var/www/app/views/about.php'];,再通过$_GET['page']查键,不在白名单中直接exit -
路径规范化校验:若必须处理用户传的文件名,先用
basename()剥离路径,再用realpath()转成绝对路径,最后检查是否仍落在预设目录内,例如:if (strpos(realpath($path), '/var/www/app/includes/') !== 0) { die('Access denied'); } -
php.ini 级限制:设置
open_basedir = /var/www/app/,让所有文件操作被强制约束在该目录下;同时确认allow_url_include = Off(防 RFI)和disable_functions = include,require,include_once,require_once(仅限开发调试,生产慎用)
升级 PHP 8.5.12 后必须立刻验证的点
升级只是第一步,不验证等于没做:
- 检查
phpinfo()页面,确认Loaded Configuration File指向的是你修改过的php.ini,而非某个被覆盖的副本 - 用
ini_get('open_basedir')和ini_get('allow_url_include')在脚本里实际读取值,避免 FPM pool 配置覆盖全局设置 - 手动触发一次典型 LFI 测试(如
?file=../../etc/passwd),观察是否返回 403 或空响应,而不是文件内容或 PHP 报错泄露路径 - 特别注意日志包含、Session 文件包含等隐式 LFI 场景——它们不依赖 GET 参数,而是靠攻击者往日志或 session 存储区注入 payload
最易被忽略的是:LFI 防御效果不取决于 PHP 版本号,而取决于你是否切断了「用户输入 → include 路径」这条链路。哪怕用 PHP 10.0,只要还存在 include($_REQUEST['x']),漏洞就在。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










