thinkphp6.0默认不自动开启全局参数过滤,所有统一过滤均依赖中间件显式注册;需检查app/middleware.php是否含filtervalue::class或自定义过滤中间件,并确认request::param()等方法未被绕过或误用。

直接看 app/middleware.php 和 app/provider.php,再结合 think\Request 类的实现逻辑,就能定位全局过滤规则是否生效、在哪被绕过。
查中间件注册链:确认过滤是否启用
ThinkPHP6.0 默认不自动开启全局参数过滤,所有“统一过滤”都依赖中间件显式注册。打开 app/middleware.php,检查数组中是否包含类似以下条目:
-
think\middleware\FilterValue::class(TP6.0.3 中已弃用,但旧项目可能残留) - 自定义中间件如
app\middleware\GlobalFilter::class,需跟进其handle()方法看是否调用$request->filter()或手动处理input() - 若使用了
think\middleware\ValidatePermission::class等扩展中间件,也要检查其内部是否对参数做 trim / htmlspecialchars / addslashes 等操作
看 Request 类的 filter() 行为
全局过滤实际由 think\Request 类控制。在 vendor/topthink/framework/src/think/Request.php 中搜索 filter 方法或 getFilter 属性:
- 默认情况下,
$request->param()不自动过滤;只有显式传入filter参数才会触发,例如:$request->param('id', '', 'htmlspecialchars') - 若项目在
config/app.php中配置了'default_filter' => 'htmlspecialchars,strip_tags',该配置仅对input()方法生效(且需中间件主动调用),param()仍不受影响 - 特别注意:
$request->post()、$request->get()返回的是原始值,完全不走 filter 流程
审计路由与控制器入口:过滤是否被跳过
即使有全局过滤中间件,也可能被特定路由绕过:
- 检查
app/route.php,是否存在->middleware([])显式清空中间件的路由,尤其是 API 接口或上传入口 - 查看控制器方法签名,是否用了
Request $request依赖注入但未调用$request->filter();或直接用$_POST/$_GET超越框架管控 - 留意模型层写法,如
UserModel::where('name', $_GET['name'])->select()—— 这类直接拼接变量的操作,完全脱离 Request 过滤体系
验证是否存在“假过滤”陷阱
有些项目看似做了过滤,实则无效:
- 只对字符串字段调用
htmlspecialchars,但 SQL 查询中仍用未过滤变量拼接 where 条件(宽字节注入、正则绕过仍可发生) - 过滤函数放在视图层(如模板中
{$name|htmlspecialchars}),但控制器已用该变量执行数据库操作 - 使用
addslashes()替代参数绑定,而数据库连接字符集设为 gbk —— 此时宽字节注入依然成立
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











