thinkphp漏洞修复后缓存清理不干净,需清除三类关键缓存:一、模板编译缓存(runtime/temp/及thinkphp目录);二、路由与配置缓存(runtime/data/route.php、config.php或tp8.0的runtime/cache/route.php);三、redis等驱动层缓存(需手动清前缀及标签缓存)。

ThinkPHP漏洞修复后缓存清理不干净,不是“清得不够狠”,而是清错了地方、漏了关键层、或环境没切对。尤其在安全加固(比如升级补丁、禁用危险函数、修改入口过滤逻辑)之后,旧缓存可能仍携带被攻击利用过的编译代码或配置逻辑,导致修复形同虚设。
下面分三类场景讲清楚怎么处理:
一、模板编译缓存残留(最常被忽略)
漏洞修复常涉及模板语法限制(如禁用 {php} 标签、过滤 eval 行为),但旧模板已被编译成 PHP 文件并缓存在 Runtime/Temp/ 下,框架会直接 require 它,完全绕过新规则。
-
Runtime/Temp/下的*.php文件(如abc123_template_index.html.php)必须全部删除 -
Runtime/Temp/thinkphp/目录也要清空(TP5.1+ 存框架自身编译片段) - 不要只删
Runtime/Cache/—— 那里只是查询缓存,和模板执行无关
建议命令(项目根目录执行):
rm -f Runtime/Temp/*.php rm -rf Runtime/Temp/thinkphp/
二、路由与配置缓存未更新(导致新规则不生效)
比如你修复了路由层 SSRF 漏洞,加了参数白名单,但 Runtime/Data/route.php 或 Runtime/Data/config.php 还是旧版本,请求进来直接走缓存跳过校验逻辑。
-
Runtime/Data/route.php:路由定义缓存,改了Route::rule()必须删 -
Runtime/Data/config.php:若自定义了安全相关配置(如security.allow_hosts),也需同步刷新 - TP8.0 路由缓存默认在
runtime/cache/route.php,路径略有不同,别找错位置
建议操作:
rm -f Runtime/Data/route.php Runtime/Data/config.php # TP8.0 用户请额外执行: php think clear:route
三、缓存驱动层没清干净(尤其是 Redis 场景)
漏洞修复后,如果用了 Redis 做缓存,旧的恶意 payload 可能还存在 key 中(比如通过 cache('user:1', $payload) 写入),php think clear --all 默认不清理 Redis,只清文件。
- 查当前缓存驱动:看
config/cache.php的default和stores['redis']配置 - 若用 Redis,手动清对应前缀(如
think_cache:*、think_tag:*) - 标签缓存(
Cache::tag('user')->set())必须用Cache::tag('user')->clear(),不能靠clear()全局清
验证是否清掉:
// 在控制器里临时加一行
var_dump(cache()->store('redis')->has('dangerous_key')); // 应返回 false
安全起见,上线修复后可临时把 config/cache.php 中 default 改成 'null',跑一轮核心流程确认无异常,再切回真实驱动。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











