PHP 8.1.29 不修复 Cookie 引发的反序列化漏洞,该漏洞源于应用层代码缺陷;须禁用 unserialize(),改用 json_encode/decode 或 igbinary,强制白名单类名并配合输入校验与运行时防护。

PHP 8.1.29 本身不修复 Cookie 传入导致的反序列化漏洞——它只修复 CVE-2024-4577 这类运行时解释器级漏洞。Cookie 引发的反序列化问题属于你写的代码逻辑缺陷,和 PHP 版本无关,必须从应用层防御。
确认漏洞是否真由 Cookie 触发
先检查代码中是否存在类似这样的危险模式:
$data = $_COOKIE['user_data'] ?? ''; unserialize($data);- 或通过框架自动反序列化(如旧版 ThinkPHP 的
input('cookie.', '', 'unserialize')) - 即使用了
json_decode()但后续又转成对象再调用unserialize()(常见于兼容旧逻辑)
只要数据源可控(如 Cookie、GET、POST、Header),且未经校验就进 unserialize(),就构成可利用链。
禁用危险入口,改用安全替代方案
不要修复“怎么让 unserialize 更安全”,而要直接移除它:
- 把 Cookie 存储内容从
serialize()全部换成json_encode()+json_decode($data, true) - 若必须保持对象结构,改用
igbinary_serialize()(需扩展支持)并严格限定反序列化类型 - 彻底删除所有
unserialize($_COOKIE[...])调用,哪怕加了if (is_string($x) && !preg_match('/[oc]:/i', $x))这类黑名单过滤——已证明无效
强制白名单 + 类型约束
如果业务强依赖反序列化(极少数遗留场景),必须启用 allowed_classes 参数:
unserialize($raw, ['allowed_classes' => ['UserInfo', 'CartSession']]);- 类名必须写死,不能拼接变量;不允许传
true或空数组 - 配合
__wakeup()中手动校验属性类型与范围(例如:is_int($this->id) && $this->id > 0)
注意:PHP 7.4+ 才支持该参数,8.1.29 已具备,但仅靠它不够,仍需上层输入过滤。
运行时防护兜底
在 Web 服务器或 PHP 配置层面加一层拦截:
- 在
php.ini中设unserialize_callback_func = "my_unserialize_handler",自定义函数记录/阻断非常规类名调用 - 用 RASP(如 OpenRASP)规则拦截含
O:、C:、a:开头且来源为 Cookie 的请求 - Nginx/Apache 配置中对疑似序列化字符串的 Cookie 值(如含
{s:[0-9]+:或O:[0-9]+:)返回 400
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











