ThinkPHP漏洞修复需三层面同步加固:框架配置强制关闭调试与隐式路由、业务代码清除eval类危险函数、Web服务器层部署IP封禁与Nginx规则拦截。

ThinkPHP漏洞修复后,攻击者仍可能通过未清理的危险配置、残留的业务代码注入点或未加固的路由机制重新突破防线,必须从框架配置、业务代码、Web服务器三层面同步封堵所有可利用路径。
检查并锁定核心安全配置项
打开 config/app.php,逐项确认以下键值已强制设为安全态:
‘app_debug’ => false → ‘show_error_msg’ => false → ‘trace’ => [‘status’ => false] → ‘auto_route’ => false → ‘url_route_must’ => true
这五项缺一不可。【url_route_must=false是隐式路由遍历的开关,只要它为false,哪怕其他都关了,攻击者仍能暴力扫出/admin/user/edit这类未声明路由】
立即学习“PHP免费学习笔记(深入)”;
同时检查 .env 文件,确保 APP_DEBUG=false、SHOW_ERROR_MSG=false 未被覆盖;若存在多环境配置,需在每个环境的 config/app.php 中单独校验。
清除业务层 eval 类动态执行残留
全项目 grep -r 'eval\|call_user_func\|create_function\|\$\$' --include="*.php" ./app/ ./command/ ./common/
重点排查以下5类高危位置:API分发器中的 $action() 调用、邮件模板渲染函数、表单验证规则引擎、插件配置加载逻辑、VPS测试类定时脚本。
发现匹配行后,立即替换为白名单硬编码调用或策略模式——【禁止保留任何用户输入直接拼入函数名或代码字符串的逻辑,哪怕加了正则过滤也不行】
加固多语言功能防目录遍历
方法一:直接关闭(推荐)
删除 app/middleware.php 中 \think\middleware\LoadLangPack::class 的注册项;清空 config/lang.php 中所有配置;全局搜索 Lang::setLangSet() 和 app()->lang->setLangSet() 并注释掉调用。
方法二:保留但加固
在语言包加载入口处插入 realpath 白名单校验逻辑:先用 basename() 提取 lang 参数值,再拼接完整路径,调用 realpath() 解析真实路径,最后比对是否以 config('lang.path') 的 realpath 结果开头;不匹配则 throw new HttpException(400)。
注意:仅用 str_replace(['..','/']等简单过滤无效,%2e%2e%2f 等编码绕过可直接穿透。
部署应用层IP行为封禁中间件
第一步:创建 app/middleware/RouteGuard.php
第二步:在 handle() 方法中获取 Request::pathinfo(),对含 ../、php://、data://、// 或连续点号的路径直接 abort(403)
第三步:使用 Cache::tag('ip_ban')->get($ip, 0) 记录该 IP 60 秒内访问非白名单路径次数,超 15 次则写入黑名单缓存(有效期 3600 秒)
第四步:白名单路径硬编码为 ['/', '/login', '/captcha', '/api/v1/health'],不读配置项
第五步:在 app/middleware.php 的全局中间件队列顶部注册该中间件
Nginx 层拦截高危请求特征
在 server 块中添加如下规则:
if ($args ~* "(s=|/think\app/invokefunction|function=call_user_func|array.*=eval)") { return 403; }
if ($request_uri ~* "\.\./|php://|data://|phar://") { return 403; }
这两条规则必须放在所有 location 块之外、server 块之内,否则不生效。



















