ThinkPHP 6.1.1存在反序列化风险,需切断入口可控性、反序列化执行点、危险类加载三环节:禁用unserialize调用、限制危险类加载、强化输入过滤,并建议升级至6.3.x LTS版本。

ThinkPHP 6.1.1 存在已知反序列化风险,虽非官方CVE收录的高危版本(如CVE-2024-44902影响的是v6.1.3–v8.0.4),但其底层类库(如think\Model、think\process\pipes\Windows等)仍保留可被构造POP链的魔术方法调用路径。加固重点不是“等补丁”,而是切断攻击链的三个关键环节:入口可控性、反序列化执行点、危险类加载能力。
关闭所有显式unserialize调用点
这是最直接有效的防线。全项目搜索unserialize(、__unserialize(,尤其关注以下位置:
- 自定义控制器中手动反序列化的逻辑(如
public function test(){ unserialize($_POST['data']); })——必须删除或替换为json_decode()等安全替代方案 - 第三方扩展或旧版兼容代码中残留的
unserialize()调用,特别是处理cookie、session、缓存数据时 - 日志回放、调试接口、测试路由等临时功能中未清理的反序列化入口
禁用危险类的自动加载与反序列化能力
ThinkPHP 6.1.1 默认启用Composer自动加载,但攻击者可能通过伪造类名触发未预期的类实例化。需主动限制:
- 在
config/app.php中设置'default_return_type' => 'json',避免框架隐式尝试反序列化响应内容 - 检查
runtime/目录权限,确保cache、log子目录不可执行、不可写入PHP文件(防止Phar反序列化利用) - 若使用Memcached/Redis作为缓存后端,确认PHP配置中
phar.readonly = On(php.ini),并禁用phar.stream_wrapper_register()
强化输入过滤与上下文隔离
反序列化漏洞常依赖用户输入直达反序列化函数。即使无法完全移除unserialize()(如某些历史模块强依赖),也必须加严校验:
立即学习“PHP免费学习笔记(深入)”;
- 对所有可能进入反序列化流程的参数(如
$_GET['s']、$_COOKIE['thinkphp']、$_POST['payload'])做白名单校验,仅允许ASCII字母、数字、下划线、短横线 - 使用
filter_var()配合FILTER_SANITIZE_STRING(PHP 7.x)或FILTER_SANITIZE_SPECIAL_CHARS预处理,剥离控制字符和空字节 - 在反序列化前强制校验字符串结构:用正则
/^O:\d+:"[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*":\d+:\{.*\}$/s粗筛合法序列化对象格式,不匹配则直接中断
升级与替代建议
ThinkPHP 6.1.1 已停止官方维护。生产环境不应长期停留在此版本:
- 优先升级至6.3.x LTS分支(当前最新LTS为6.3.8),该分支已修复多个
Model::__destruct、Request::input相关POP链路径 - 若无法升级,可手动打补丁:重写
think\Model类的__destruct()方法,增加if (!$this->lazySave || !is_object($this)) { return; }前置判断 - 对关键业务模块,改用JSON通信替代PHP原生序列化,前端用
JSON.stringify(),后端统一用json_decode($raw, true)解析



















