thinkphp 5.0.15 sql注入漏洞源于parsedata()方法未校验数组型输入字段合法性,导致inc/dec/exp操作拼接恶意sql;官方在5.0.16中修复,新增字段白名单判断与exp上下文校验,并建议升级至5.0.24。

ThinkPHP 5.0.15 的 SQL 注入漏洞核心在于 parseData() 方法对数组型用户输入(如 username[0]=inc&username[1]=…)缺乏字段合法性校验,导致 inc/dec/exp 类操作直接拼接恶意 SQL 片段。修补需从框架升级、代码加固、配置收敛三方面入手,不能仅靠单点过滤。
立即升级至安全版本
官方已在 5.0.16 版本中修复该漏洞,关键修改位于 thinkphp/library/think/db/Builder.php 的 parseData() 方法:
- 新增字段白名单判断:仅当
$val[1](即 payload 中的第二项)与数据库真实字段名完全匹配时,才允许进入inc/dec分支 - 阻断任意表达式执行:对
exp类型数据增加上下文校验,不再无条件信任$val[1] - 影响范围明确:该补丁覆盖
insert()、update()、setInc()、setDec()等所有调用parseData()的方法
建议直接升级到 5.0.24 或更高稳定版(5.0.x 系列最终版),避免使用已停止维护的 5.0.15。
临时代码层防护(未升级前必做)
若因兼容性暂无法升级,需在业务控制器中主动拦截风险输入:
- 禁用数组型参数接收:将
input('username/a')改为input('username/s', ''),强制转为字符串,使username[0]等无法被解析为数组 - 显式校验输入类型:对所有涉及数据库写入的参数,添加
is_string($param) && !is_array($param)判断,拒绝数组输入 - 重写 insert/update 调用:避免直接传入未经清洗的
$_GET或$_POST数组,改用键值对硬编码赋值,例如:
db('users')->insert(['username' => $cleanedUsername]);
运行时环境加固
降低漏洞利用成功率与信息泄露风险:
- 关闭调试模式:将
app_debug设为 false,防止报错注入时直接回显数据库用户名、表名等敏感信息 - 限制数据库账户权限:应用数据库账号仅授予
INSERT、UPDATE、SELECT权限,禁用FILE、EXECUTE、PROCESS等高危权限 - 启用 WAF 规则:在 Nginx/Apache 层或云 WAF 添加规则,拦截含
updatexml(、extractvalue(、concat(0x、[0-9]+\[0\]=inc等特征的请求
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











