php 8.3.36修复的是cve-2026-109618和cve-2026-109619两个远程代码执行漏洞,而非json解析异常;json_decode返回null是正常设计行为,非漏洞。

PHP 8.3.36 **不修复 JSON 解析异常漏洞**——它修复的是两个远程代码执行(RCE)漏洞(CVE-2026-109618 / CVE-2026-109619),与 json_decode() 的解析逻辑、语法错误或返回 null 无关。
json_decode() 返回 null 不是漏洞,是设计行为
json_decode() 在 PHP 所有版本(包括 8.3.36)中,解析失败时默认返回 null,这是明确的 API 行为,不是缺陷。所谓“JSON 解析异常漏洞”在官方安全公告和补丁说明中并不存在。你遇到的 null,99% 是输入问题,不是安全漏洞。
常见诱因包括:
- API 返回了 HTML 错误页(如 502、404),却被当 JSON 解析
- 字符串含 UTF-8 BOM(
\xEF\xBB\xBF)或控制字符(\x00、\t、\r) - JSON 被截断(cURL 超时、Nginx
proxy_buffer_size太小、MySQL TEXT 字段长度不足) - 嵌套过深,默认深度 512 层不够用,触发
JSON_ERROR_DEPTH
必须立刻检查 json_last_error(),不能只判 null
每次调用 json_decode() 后,下一行就得查错误码:
$data = json_decode($json, true);
if ($data === null && json_last_error() !== JSON_ERROR_NONE) {
// 真正的错误在这里
$msg = json_last_error_msg(); // 如 "Syntax error" 或 "Unexpected control character"
}
注意:json_last_error() 是全局状态,中间若调用了其他 JSON 函数(比如日志里写了 json_encode()),结果会被覆盖。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
推荐开发环境强制启用异常模式:
try {
$data = json_decode($json, true, 512, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
error_log('JSON parse failed: ' . $e->getMessage());
}
PHP 8.3.36 真正要做的安全动作:升级并验证 RCE 补丁
你当前运行的如果是 8.3.x ,必须立即升级。该版本修复的是底层内存管理缺陷,攻击者可在无认证、无前置漏洞条件下触发远程代码执行。
验证是否生效:
- 执行
php -v,确认输出为PHP 8.3.36(不是 8.3.35 或更低) - 检查 Web 服务器实际加载的 PHP 版本(
phpinfo()页面或$_SERVER['SERVER_SOFTWARE']可能滞后) - 若使用 Docker,确认基础镜像已更新(如
php:8.3.36-apache),而非仅本地 CLI 升级 - 发行版用户(如 Ubuntu/AlmaLinux)不能只看上游版本号,须查厂商安全公告是否已回移补丁
JSON 解析出错从来不是“等升级就自动好”的问题;它需要你主动清洗输入、预检长度、限制深度、捕获异常。而 RCE 漏洞才是那个必须今天就打补丁、重启服务、验证生效的紧急项。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










