PHP反序列化漏洞修复核心是彻底移除不可信输入的unserialize调用,优先替换为带严格校验的json_decode;若必须保留,则限PHP 5.6.25+、设allowed_classes白名单、禁phar协议,并配套关闭危险配置与加强审计。

PHP 5 系统已停止官方支持多年,反序列化漏洞在其中尤为高危——不是因为技术复杂,而是因为 unserialize() 被广泛用于 Cookie、Session、缓存、表单隐藏字段等场景,且默认不设防。修复核心不是“加固反序列化”,而是彻底移除对不可信输入的 unserialize 调用。
识别所有 unserialize 入口点
老旧系统中,unserialize 往往藏在不易察觉的位置:
- Cookie 解析逻辑(如
unserialize($_COOKIE['pref'])) - 文件缓存读取(ThinkPHP
File->read()、自定义 cache 类) - Session 反解(尤其当
session.serialize_handler=php且 session 数据被污染时) - 日志回放、导入导出模块、调试接口中显式调用
- 第三方库或 CMS 插件(如旧版 Dedecms、Discuz!、Typecho 组件)
优先替换为 JSON 格式
JSON 不会重建对象、不触发魔术方法,是替代 unserialize 最安全、最直接的方式:
- 将原
unserialize($input)替换为json_decode($input, true) - 必须校验 JSON 解析结果:检查是否为数组、字段是否存在、类型是否匹配(如布尔值不能接受字符串
"false") - 限制最大长度(如 10KB)、嵌套深度(
json_decode($s, true, 5))、禁止特殊字符(如控制字符、BOM) - 服务端定义明确 Schema:只允许
nickname(string)、theme(枚举)、notify(bool),其余字段一律丢弃
若必须保留 unserialize(极少数遗留兼容场景)
仅限 PHP 5.6.25+(需确认环境实际版本),且仅作为临时过渡手段:
- 强制添加
allowed_classes参数(PHP 5.6.25+ 支持):unserialize($data, ['allowed_classes' => ['MySafeConfig']]) - 严禁传入
true、[]或空数组——这等于未设限;传false表示禁止所有类(只接受数组/标量) - 白名单中不得包含框架核心类(如
think\Request、Illuminate\Http\Request)、Model 类、可利用 POP 链的类 - 禁用
phar://协议:确保phar.readonly = On,并在 Web 服务器层拦截(Nginx 中加if ($request_uri ~* "phar://") { return 403; })
配套加固与验证动作
单改代码不够,需同步收紧运行环境和审计流程:
- 关闭危险配置:
allow_url_include = Off、register_globals = Off(PHP 5.x 默认关,但需确认) - 检查所有
include/require是否拼接用户输入,防止 LFI 成为反序列化跳板 - 扫描所有使用
extract()、parse_str()的位置,避免变量覆盖扩大攻击面 - 用静态工具(如 RIPS、PHPStan)跑一遍,重点标记含
unserialize、__wakeup、__destruct的文件 - 上线前用四类测试用例验证:合法 JSON、超长 JSON、非法字段 JSON、伪造序列化字符串(应直接报错,不回退到 unserialize)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











