ThinkPHP 6.0.6 不存在官方披露的“控制器自动加载漏洞”CVE/CNVD编号,实际风险源于开发不规范导致的动态类名拼接与反序列化混用,需通过白名单校验、禁用危险协议及升级至6.3.x LTS版本加固。

ThinkPHP 6.0.6 并未被官方披露存在“控制器自动加载漏洞”这一独立 CVE 或 CNVD 编号漏洞。当前权威漏洞库(CNVD、CVE、ThinkPHP 官方安全公告)及最新审计资料中,无针对 v6.0.6 版本的“控制器自动加载漏洞”正式记录。
但结合你提到的关键词和实际攻防场景,大概率指向两类高发风险:
-
误用控制器类名动态加载:如通过 URL 参数(如
?c=User)拼接类名并反射实例化,且未校验命名空间或白名单; -
与反序列化漏洞混用:攻击者构造恶意 payload 触发
__autoload/spl_autoload_call,加载非预期控制器类(如伪造的App\Controller\Phar://xxx),进而触发 Phar 反序列化链。
这两类问题在 6.0.6 中确实存在现实利用基础(该版本尚未引入 6.3+ 的严格类名过滤与路由绑定机制),但本质属于开发不规范 + 配置疏漏,而非框架自身代码级漏洞。因此,“打补丁”不是替换一个 patch 文件,而是针对性加固。
明确控制器加载入口点
ThinkPHP 6.0.6 的控制器由 think\Route 和 think\App 协同调度,关键路径包括:
立即学习“PHP免费学习笔记(深入)”;
- 路由变量解析(如
:controller规则) -
app()->controller()手动调用 - 第三方插件或自定义中间件中
Loader::parseName($name, 1, true)类名解析逻辑
✅ 操作建议:
- 全项目搜索
controller(、->controller(、Loader::parseName(、class_exists(+ 用户输入拼接,定位动态加载点 - 禁用所有基于用户输入(
$_GET['c']、$_POST['controller'])直接生成控制器类名的逻辑
强制控制器类名白名单校验
6.0.6 默认不限制控制器命名空间,需手动加严:
// 在应用初始化中间件或 Base Controller 构造方法中
$controller = $this->request->param('c', 'index');
$allowed = ['Index', 'User', 'Order', 'Api']; // 显式列出合法控制器名(不含命名空间前缀)
if (!in_array($controller, $allowed)) {
throw new HttpException(404, 'Controller not allowed');
}若使用路由变量(如 route/[:controller]),应在路由定义时绑定约束:
Route::rule('api/:controller', 'api/:controller')->validate(function($value) {
return in_array($value, ['User', 'Product']);
});禁用危险类加载与文件协议
防止通过控制器名注入 phar://、data://、php://filter 等协议:
✅ 操作建议:
- 确保 PHP 配置
phar.readonly = On(php.ini) - 关闭
allow_url_include = Off - 运行时禁用协议注册(可放入
public/index.php头部):stream_wrapper_unregister('phar'); stream_wrapper_unregister('data'); - 检查
runtime/cache/和runtime/log/目录权限,禁止写入.php或.phar后缀文件
升级是最稳妥的长期方案
6.0.6 属于早期 6.0.x 分支,已停止安全维护。官方明确建议:
-
升至 6.3.x LTS 版本(2026年仍在维护周期内),其内置:
- 控制器类名自动截断命名空间前缀(仅允许
app\controller\*) - 路由参数默认启用正则白名单(
[\w]+) -
Loader::parseName()增加strict模式,拒绝非字母数字下划线字符
- 控制器类名自动截断命名空间前缀(仅允许
升级后无需额外补丁,多数此类风险自然消除。



















