最核心的修复动作是切断不可信数据进入unserialize()的路径;需全项目搜索并移除unserialize()调用点,替换为json_decode(),强制启用allowed_classes白名单,关闭phar协议,升级至thinkphp 8.0.5+或6.1.12+。

最核心的修复动作是:**切断不可信数据进入 unserialize() 的路径**。只要用户输入没经过强校验就进了反序列化函数,再复杂的防护都可能被绕过。
彻底移除或替换危险调用点
全项目搜索 unserialize(、__unserialize(,重点检查以下位置:
- 控制器中类似
unserialize($_GET['data'])或unserialize($_COOKIE['x'])的代码——一律删除,改用json_decode($input, true) - 缓存驱动(如
think\cache\driver\File->read()、Memcached->get())中对存储内容直接反序列化——确认是否可配置为 JSON 存储,或重写get()方法做类型预检 - Session 驱动(如 Redis/Memcache)读取后直接
unserialize()——切换为session.serialize_handler = php_serialize并禁用php_binary方式 - 日志回放、调试接口、旧版兼容模块中的残留调用——全部清理,不保留“临时用一下”的逻辑
强制启用 allowed_classes 白名单
PHP 7.4+ 必须为每个 unserialize() 调用显式传入白名单参数:
- 完全禁止对象还原:
unserialize($data, ['allowed_classes' => false]) - 仅允许极少数安全类:
unserialize($data, ['allowed_classes' => ['stdClass', 'DateTime', 'Exception']]) -
严禁将
think\Model、think\Request、think\Cache等框架核心类加入白名单 - 空数组
[]或未设该参数,等同于无防护
关闭 Phar 协议与危险流封装器
Phar 是反序列化漏洞最常用触发媒介,必须从运行时层面阻断:
- 在
php.ini中设置:phar.readonly = On(默认值,但需确认未被手动关掉) - 禁用远程协议:
allow_url_include = Off、allow_url_fopen = Off - 在 Web 服务器层拦截:
Nginx 添加if ($request_uri ~* "phar://") { return 403; }
Apache 添加RedirectMatch 403 "phar://" - 检查代码中是否调用
stream_wrapper_register(),禁止注册filter://、data://等危险协议
升级框架并禁用高危组件
ThinkPHP 用户请优先执行:
- 升级至 8.0.5+ 或 6.1.12+(已修复 CVE-2024-44902 等主流链)
- 若使用 Memcached 缓存,临时切换为
file或redis驱动;非必要不启用memcached.so扩展 - 禁用危险函数:
disable_functions = unserialize, exec, system, shell_exec, passthru, file_put_contents - 确保
runtime/目录下cache/和log/子目录不可执行、不可写入 PHP 文件
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











