应升级至ThinkPHP 5.1.40或更高版本,修复CVE-2018-15393等反序列化漏洞,并同步关闭调试模式、移除unserialize调用、校验控制器名及配置PHP反序列化回调。

ThinkPHP 5.1 升级到安全版本,核心是停止使用已知存在高危漏洞的旧版(如 ≤5.1.38),升级至官方修复后的稳定版(≥5.1.40)并同步加固运行环境。这不是简单换文件,而是“补丁+配置+代码”三重闭环。
明确目标安全版本
官方自 5.1.39 起修复反序列化关键利用链,5.1.40 是首个全面加固的推荐稳定版。低于该版本(尤其 ≤5.1.37)存在可被远程利用的反序列化漏洞(CVE-2018-15393 等),且控制器名校验缺陷可能导致 getshell。务必升至 5.1.40 或更高(如 5.1.42,兼容 PHP 8.2 动态属性警告)。
执行升级操作
-
运行命令更新框架:
composer update topthink/framework:^5.1.40 --with-dependencies
检查
composer.lock中topthink/framework版本是否 ≥5.1.40,避免因依赖锁定回退。立即学习“PHP免费学习笔记(深入)”;
-
强制刷新自动加载:
composer dump-autoload -o
清空运行时缓存(关键!否则旧类定义仍可能加载):
删除runtime/目录全部内容。
同步完成安全加固
仅升级框架不够,必须配合以下配置与代码调整:
关闭调试模式:
确保config/app.php中'app_debug' => false,防止错误信息泄露类路径和调用栈。移除所有
unserialize()调用:
全局搜索unserialize(、base64_decode(+unserialize组合,替换为json_decode();若确需保留,必须加白名单校验(如限定类名前缀、验证 base64 格式)。-
限制控制器名输入:
即使已升级,也建议在路由层补充校验(尤其未开启强制路由时):
在app/common.php或基础控制器中加入:if (!preg_match('/^[A-Za-z][\w.]*$/', $controller)) { throw new \think\exception\HttpException(404, 'controller not exists: ' . $controller); } -
PHP 层防护(可选但强烈建议):
在php.ini中添加:unserialize_callback_func = "unserialize_callback"
并在入口文件定义该函数:
function unserialize_callback($class) { throw new Exception('Unserialize blocked'); }
不复杂但容易忽略



















