直接使用unserialize()处理用户输入等于开放远程代码执行后门,因其会自动触发__wakeup()、__destruct()等魔术方法,若其中调用危险函数即可被利用;php 7.0+需强制设置allowed_classes参数,推荐设为false或白名单,同时应优先替换为json_decode()等安全方案。

直接用 unserialize() 处理用户可控输入,等于给攻击者开了个远程执行后门——只要目标环境里存在带危险逻辑的类,漏洞就成立。
为什么 unserialize() 一调用就可能出事
PHP 反序列化不是简单还原数据,它会重建对象并自动触发魔术方法:__wakeup() 在反序列化完成时立即执行,__destruct() 在对象销毁前执行。如果这些方法里调用了 system()、file_put_contents()、call_user_func() 等函数,攻击者就能通过构造恶意序列化字符串控制执行流。
- 常见触发点包括:用户登录态存储(如 session 反序列化)、缓存读取(Redis/Memcached 中存的序列化值)、API 请求体解析、日志回放功能
- 即使类本身没写错,只要项目依赖了第三方库(比如旧版 ThinkPHP 的
think\process\pipes\Windows类),也可能自带 POP 链 - PHP 7.4+ 默认禁用
unserialize()的对象创建(unserialize($str, ['allowed_classes' => false])),但很多老代码没加这个参数
allowed_classes 参数不是可选,是必须显式设置
PHP 7.0 起支持 unserialize() 的第二个参数数组,其中 allowed_classes 控制哪些类允许被实例化。不传该参数或设为 true,等于完全放开;设为 false 则禁止所有类(只允许基础类型);最稳妥的是白名单数组。
- 错误写法:
unserialize($input)—— 允许任意类,高危 - 保守写法:
unserialize($input, ['allowed_classes' => false])—— 只接受数组、字符串等基础类型 - 业务需要类时:
unserialize($input, ['allowed_classes' => ['User', 'CacheItem']])—— 明确限定范围 - 注意:
allowed_classes对__PHP_Incomplete_Class无效,且无法阻止已加载类的魔术方法执行,所以仍需配合其他措施
别信“我只反序列化自己生成的数据”
很多开发者认为“数据是我自己 serialize() 的,肯定安全”,但实际中存在多个绕过场景:
- session 存储若用
php_serialize处理器,且 session.save_path 可被写入(如共享主机),攻击者可伪造 session 文件 - Redis 缓存若未做 key 隔离,攻击者可能通过其他接口污染缓存值,再由反序列化逻辑读取
- 前端 JS 生成的序列化字符串(如通过
JSON.stringify()模拟)被后端误用unserialize()解析,导致类型混淆 - 哪怕数据源看似可信,一旦中间件(如 Nginx、CDN)或日志系统对请求体做了编码/解码转换,原始字节就可能被篡改
真正有效的防御不是堵一个函数,而是切断链路
把 unserialize() 替换成 json_decode() 是最直接的降级方案——JSON 不支持对象方法、不触发魔术方法、天然无执行风险。但要注意兼容性断层:
- 原有类结构需转为纯数组或 stdClass,
__sleep()/__wakeup()逻辑得重写为显式初始化 - 如果必须保留对象语义(比如 ORM 实体),改用
igbinary或msgpack并启用严格模式,比原生serialize()更可控 - 所有反序列化入口点(包括
session_start()的处理器配置、unserialize_callback_func设置)都要审计,不能只盯住某一行unserialize() - 上线前用静态扫描工具(如 PHPStan + 自定义规则)搜
unserialize\(,再人工确认每个调用是否满足“输入不可控 + allowed_classes 严格限制”
最常被忽略的一点:POP 链往往跨多个类,而你只看了当前文件里的代码。真正危险的不是你自己写的 __destruct(),而是 Composer 加载的某个废弃组件里藏着一个能调用 file_get_contents() 的 __toString()。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











