ThinkPHP 8.0.1本身无高危漏洞,但升级自TP5.0/6.x或配置不规范时仍存RCE、SQL注入等风险;须三步加固:清除旧版漏洞残留(拦截\think\等攻击链、禁用调试与危险函数)、启用新版安全机制(strict_types声明、主键类型定义、新路由语法、参数绑定)、用真实payload验证拦截效果(如TP5 RCE请求应返回404)。

ThinkPHP 8.0.1 本身不是高危漏洞版本,但若从旧版(尤其是 TP5.0 或 TP6.x)升级而来,或未按规范配置,仍可能残留 RCE、SQL 注入、路由绕过等风险。安全加固不是“装完就完”,而要分三步走:先堵住历史漏洞入口,再校准新版安全机制,最后验证真实攻击面是否关闭。
一、必须清除的旧版漏洞残留
TP8.0.1 不会自动修复你从 TP5.0 升级时带进来的“老炸弹”:
- 立即检查 public/index.php 或全局中间件中是否已硬性拦截含
\think\、invokefunction、call_user_func、eval的请求参数——这些是 TP5.0 RCE(CVE-2018-20062 等)的标准攻击链,不拦截等于开门揖盗 - 确认 config/app.php 中
'app_debug' => false和'auto_route' => false已显式设置,生产环境开启调试或自动路由,等于把控制器方法列表直接暴露给扫描器 - 检查 php.ini 中
disable_functions是否已禁用system,exec,passthru,shell_exec,proc_open,popen,pcntl_exec——TP5.0 插件常调用这些函数,TP8.0 不会帮你屏蔽
二、TP8.0.1 新增安全机制必须启用
新版自带防护能力,但默认不全开,需手动激活:
- 在所有控制器文件顶部(
<?php后第一行)添加declare(strict_types=1);,否则public function detail(int $id)这类类型声明形同虚设,传字符串也不会报错 - 模型类中必须声明主键类型:
protected $pkType = 'int';(数字型)或protected $pkType = 'string';(如 UUID),否则关联查询失效且无提示 - 路由注册改用新语法:
Route::get('user/:id', [app\controller\User::class, 'read']);,旧式字符串路由(如'index/User/read')在 TP8 中直接 404,易被绕过 - 数据库查询禁用原始拼接:
where("id = $id")必须改为where('id', $id)或绑定参数,否则 SQL 注入风险仍在
三、关键验证动作不能跳过
加固是否生效,得用真实攻击载荷验证,不能只看页面是否能打开:
立即学习“PHP免费学习笔记(深入)”;
- 手动构造经典 TP5 RCE 请求:
GET /index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=,返回 404 或拦截提示才算有效 - 测试调试模式是否真关闭:访问
/index.php?m=home&c=index&a=debug类路径,应返回 404 而非变量 dump 页面 - 清空 runtime/ 目录后重启服务,再运行
php think route:list,确认输出的路由表不含未授权接口(如/:controller/:action这类通配路由) - 用
composer check-platform-reqs检查 PHP 扩展兼容性,确保pdo_mysql、mbstring、openssl全部通过,缺失扩展可能导致加密、数据库等模块降级为不安全逻辑
不复杂但容易忽略。



















