修复PHP框架路由绕过漏洞的关键是切断攻击者从路由入口向控制器、方法、参数的层层穿透路径,需限制路由变量格式与长度、拦截非法命名空间、关闭动态调用、加固请求解析,并对上传与路径类参数实施白名单校验和执行隔离。

修复PHP框架路由绕过漏洞,关键不是堵某一条URL,而是切断攻击者从路由入口向控制器、方法、参数层层穿透的路径。不同框架表现不同,但核心思路一致:限制路由变量、拦截非法命名空间、关闭动态调用、加固请求解析。
限制路由变量格式与长度
通配符路由(如 /:id 或 :controller/:action)若无校验,极易被用于目录穿越或控制器名注入。
- ThinkPHP 6.x:所有显式路由必须加正则约束,例如
Route::get('user/:id', 'user.read')->pattern(['id' => 'd{1,8}']); - ThinkPHP 5.x:避免使用
[:s]类型泛匹配;改用白名单式路由规则,如'/user/d+' => 'index/user/read' - 禁止在路由中直接拼接用户输入,尤其不能将
input('c')、input('a')用于动态加载控制器或方法
拦截非法命名空间与系统类调用
攻击者常通过 ?s=index/ hinkpp/invokefunction 等方式绕过路由,直抵框架内核方法。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 在入口文件(
public/index.php)顶部硬性拦截:if (isset($_GET['s']) && preg_match('/\\think\\|invokefunction|call_user_func/i', $_GET['s'])) { die('Access Denied'); } - ThinkPHP 5.0.x:修改
thinkphp/library/think/App.php的module()方法,在解析出控制器名后立即校验:if (!preg_match('/^[A-Za-z][A-Za-z0-9]*$/', $controller)) { throw new HttpException(404); } - ThinkPHP 6.x:禁用
LoadLangPack中间件,关闭lang_switch_on,防止think_lang变量触发多语言目录穿越
关闭动态方法调用与危险配置
路由绕过往往依赖框架的反射或动态执行能力,必须从机制上禁用。
立即学习“PHP免费学习笔记(深入)”;
- 禁用
_method=__construct类型的HTTP方法伪造:重写Request::method(),只允许GET/POST/PUT/DELETE等标准方法 - 清空或禁用
var_method配置项(config/app.php中设'var_method' => '') - 关闭调试模式:
'app_debug' => false,避免错误信息泄露路由结构和类路径 - 禁用自动路由:
'auto_route' => false,强制走显式定义的路由表
上传与路径类参数需独立防护
部分绕过利用上传路径、日志路径、缓存路径等二次触发,不能只盯路由层。
- 所有接收路径参数(如
save_path、dir)必须白名单校验,只允许字母、数字、下划线、短横线 - 上传目录禁止执行PHP:Nginx 中配置
location ~ .php$ { deny all; },Apache 用.htaccess限制 - 运行时目录(如
runtime/、Logs/)必须禁止Web访问,并设置严格文件权限(目录755,文件644)


















