最直接有效的防范方式是避免对不可信数据调用unserialize();优先使用json_encode()/json_decode()替代,启用allowed_classes白名单,对序列化数据签名校验,并禁用phar等危险扩展。

最直接有效的防范方式,是避免对不可信数据调用 unserialize()。只要不反序列化用户可控输入,漏洞就无从触发。
禁用或替换不安全的反序列化
这是根本性防御措施:
- 优先使用
json_encode()/json_decode()替代序列化机制,JSON 不会触发魔术方法,天然免疫此类漏洞 - 若必须用序列化(如缓存、Session),确保数据来源完全可信——例如仅处理服务端生成并签名的数据
- 彻底删除类似
unserialize($_GET['data'])或unserialize($_COOKIE['session'])这类直接解析用户输入的代码
启用 allowed_classes 白名单
PHP 7.0+ 支持 unserialize() 的第三个参数,可严格限定允许反序列化的类名:
- 设置为
false:禁止反序列化任何对象(只允许数组、字符串等基础类型) - 设置为数组,如
['User', 'Config']:仅允许指定类被重建,其余一律报错 - 注意:白名单需精确匹配类名,包括命名空间(如
'App\Models\Post')
增加数据完整性校验
对服务端生成的序列化数据添加签名,防止篡改:
立即学习“PHP免费学习笔记(深入)”;
- 序列化后,用密钥计算 HMAC-SHA256 值,拼在数据末尾或单独传输
- 反序列化前先验证签名,失败则中止处理
- 避免使用弱哈希(如 md5)或硬编码密钥;密钥应由配置中心统一管理
加固运行环境与依赖
减少攻击面和利用条件:
- 禁用危险的扩展或功能:如关闭
phar协议(php.ini中设phar.readonly = On),防止 PHAR 文件触发反序列化 - 调整 Session 配置:使用
session.serialize_handler = php_serialize(而非php或igbinary),避免因处理器差异导致意外反序列化 - 及时升级框架和组件:ThinkPHP、Laravel 等主流框架已修复多个 POP 链相关漏洞,旧版本存在大量可利用 gadget



















