ThinkPHP 6.0需开发者主动拦截非法参数,重点防控路径遍历、嵌套注入、SQL字段污染:一、校验参数名禁用[ ]、.并限制层级;二、lang参数须realpath校验防目录遍历;三、order等方法字段名白名单校验;四、统一中间件预处理参数并设安全默认值。

ThinkPHP 6.0 本身不自动过滤非法参数,需开发者主动拦截和校验。关键不是“过滤值”,而是控制参数结构、来源路径与语义合法性——尤其要防路径遍历、嵌套注入、SQL字段污染等底层风险。
一、拦截非法参数名(扁平化路径校验)
攻击者常通过 user[info][name] 或 a.b.c.d 等嵌套键名绕过基础验证。TP6 的 input() 和 param() 默认已将 PHP 解析后的数组展平(如 user[info] 变成键 user),但原始键名仍可能残留并被误用。
- 在全局中间件中检查所有请求键名,禁用含
[、]、.的字段 - 限制点号层级 ≤2(如
a.b允许,a.b.c拒绝),因 TP6 的input('a.b.c')会静默失败 - 正则匹配更稳妥:
/[\[\]\.]/一次性覆盖三类非法符号,比只拦[]更全面
二、阻断多语言 lang 参数路径遍历
6.0.13 及以下版本存在高危目录遍历漏洞:攻击者传 lang=../../../../etc/passwd 可读取系统文件,甚至结合 pearcmd.php 实现 RCE。
- 必须用
realpath()解析目标语言包路径,并与合法根目录比对前缀 - 禁止仅用
basename()或str_replace(),它们无法防御%2e%2e%2f、.//、空字节等绕过 - 升级至 6.0.14+ 并确认关闭危险 PHP 配置(如
register_argc_argv=Off)
三、防止用户输入污染 SQL 字段与排序逻辑
order()、group()、having() 等方法不支持参数绑定,字段名必须白名单校验。
立即学习“PHP免费学习笔记(深入)”;
- 禁止拼接用户输入:
order('create_time ' . input('sort'))是严重漏洞 - 应严格限定可选字段:
$sort = in_array(input('sort'), ['id', 'create_time', 'status']) ? input('sort') : 'id'; - 表名、列别名、函数名等动态部分一律不可信,必须走配置或枚举
四、统一入口做参数清洗与默认值兜底
避免在每个控制器里重复写 empty() 判断,推荐在基类或中间件中预处理。
- 用
Request::param()获取全部参数后,再按业务规则过滤空值、非法类型 - 设置安全默认值:
param('page', 1, 'intval')、param('keyword', '', 'htmlspecialchars') - 敏感操作(如删除、支付)必须额外校验参数完整性,缺关键字段直接中断



















