PHP 8.3.36 修复的是 CVE-2026-109618 和 CVE-2026-109619 两个内存生命周期缺陷,不涉及白名单校验逻辑;所谓“绕过”实为业务层、框架或 Web 服务器配置问题,非 PHP 解释器漏洞。

PHP 8.3.36 没有白名单校验逻辑绕过漏洞。你查到的这个说法是混淆或误传——官方安全公告中明确列出的两个修复项是 CVE-2026-109618 和 CVE-2026-109619,均属内存生命周期管理缺陷(OOM状态残留、Use-After-Free),**不涉及任何白名单、输入校验、路由匹配或参数过滤逻辑**。
如果你在测试中观察到类似“白名单被绕过”的行为,大概率是以下情况之一:
为什么你看到的“白名单绕过”和 PHP 8.3.36 无关
这类现象往往出现在业务层,而非 PHP 解释器本身:
- 你的框架(如 Laravel、ThinkPHP)或自定义中间件中存在正则匹配不严谨、路径解析歧义、或未标准化 URL 的问题;
- 使用了
$_SERVER['PATH_INFO']或$_SERVER['REQUEST_URI']做路由分发,但没做rawurldecode()和规范化处理,导致双编码、空字节、大小写混用等绕过; - 上传功能启用了
session.upload_progress,而该机制在旧版 PHP 中存在状态复用风险(CVE-2026-109619 可触发),但表现可能像“绕过文件类型白名单”; - Web 服务器(如 Nginx)配置了不安全的
try_files或fastcgi_split_path_info,把恶意路径转给了 PHP,而 PHP 只是照单执行,并非它自己绕过了什么。
如何确认是不是真和 PHP 版本有关
快速排除法,三步验证:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 临时降级到
8.3.35(确保其他环境完全一致),复现相同请求,看行为是否一致; - 关闭所有 PHP 扩展(尤其是
opcache、apcu、imagick),只留mysqli和json,再试; - 用
php -S启一个最小 HTTP 服务,写一段纯var_dump($_GET)脚本,发疑似绕过的请求,看原始参数是否已被 Web 服务器篡改或截断。
如果你确实在升级后发现校验异常变弱
这不是漏洞修复导致的“倒退”,而是旧版本中某些未定义行为被新版本修正了。例如:
-
parse_url()在 8.3.35 中对畸形 URL(如http://host/..%2Fetc/passwd)可能返回不完整结果,8.3.36 修正后返回false,反而让业务层的 fallback 逻辑暴露; -
mb_ereg_replace()的 Unicode 边界处理更严格,导致原来靠“侥幸匹配”通过的正则失效; - 启用
zend.assertions = 1且代码里有assert()做白名单检查,而 8.3.36 修正了 assert 的作用域行为,使部分断言不再触发。


















