ThinkPHP 5.1.20 存在分页相关SQL注入风险,本质是where、order、field等方法未校验用户输入的字段名与排序键,攻击者可构造恶意参数如id``) --触发注入;该问题已在5.1.26+版本系统修复。

ThinkPHP 5.1.20 存在分页参数注入风险,本质不是独立“分页漏洞”,而是其底层 SQL 构造机制(尤其是 where、order、field 等方法)未对用户可控的字段名、排序键、聚合函数参数做白名单校验,导致攻击者可通过 URL 传入恶意字段名(如 id``) -- 或 name%60)UNION SELECT ...)触发 SQL 注入。该问题在 5.1.25 被集中披露并修复,而 5.1.20 属于高危受影响版本。
核心修复方式分三类,按优先级推荐:
升级框架至安全版本(最彻底)
5.1.20 的注入通病已在 5.1.26 及后续稳定版中系统性修复(如 5.1.31、5.1.40)。操作只需两步:
- 修改
composer.json中的依赖:"topthink/framework": "^5.1.31" - 执行
composer update topthink/framework - 升级后重点验证分页相关功能:
paginate()、order('user_id desc')、field(['id','name'])、where('status','in',$ids)是否仍正常,尤其注意含用户输入的$orderField或$fieldList场景。
临时加固:禁止用户直接控制字段名与排序键
若暂无法升级,必须在业务层拦截所有动态字段输入:
- 所有
order()、field()、group()、having()的参数,不得直接使用input('sort')或request()->param('by'); - 强制使用白名单映射:
$allowSort = ['id' => 'id', 'name' => 'name', 'create_time' => 'create_time DESC']; $sortBy = input('sort', 'id'); if (!isset($allowSort[$sortBy])) { throw new \Exception('非法排序字段'); } $list = Db::name('user')->order($allowSort[$sortBy])->paginate(15); - 分页本身不产生注入,但
paginate()内部调用的order()和where()若接收了污染数据,就会触发漏洞。
禁用危险调试配置并过滤输入源
- 确保
app_debug => false(避免报错泄露表结构); - 关闭
app_trace => false(防止路径与SQL片段暴露); - 对所有可能进入数据库方法的请求参数,统一做基础过滤:
- 拒绝含反引号
`、括号()、空格、SQL 关键字(如union、select、updatexml)的字符串; - 字段名限定为
/^[a-zA-Z_][a-zA-Z0-9_]*$/正则匹配,长度≤64; - 不要依赖前端传来的
?page=1&order=id%60这类编码绕过——解码后仍是非法字符。
- 拒绝含反引号
不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











