为什么MyBatis-Plus中QueryWrapper存在SQL注入风险_规范使用Wrapper方法

阿辰大大_3825

阿辰大大_3825

2026-05-26

1128人浏览

原创

mybatis-plus的querywrapper本身不引入sql注入风险,但apply、insql、last等方法若字符串拼接或未校验动态字段名则极易导致注入;eq/like等内置方法因使用preparedstatement预编译而默认安全。

为什么mybatis-plus中querywrapper存在sql注入风险_规范使用wrapper方法

MyBatis-Plus 的 QueryWrapper 本身不引入 SQL 注入风险,但**一旦你用错方法或绕过参数绑定机制,风险立刻出现**。它不是“防注入组件”,而是一个条件构造容器——安全与否,全看你怎么填。

为什么 eq/like 等内置方法默认安全

这些方法(如 eq、like、between、in)底层统一走 JDBC PreparedStatement 参数绑定,等价于 MyBatis 的 #{} 行为:

  • 参数值不会参与 SQL 解析,只作为数据传入驱动
  • queryWrapper.like("name", "admin' OR '1'='1") → 实际执行的是 WHERE name LIKE ?,参数值被原样当作字符串匹配,不会触发逻辑绕过
  • 即使用户输入含 %、_ 或单引号,只要没手动拼接进 SQL 字符串,就不会破坏语义或结构

apply 方法是唯一高频引爆点

apply 是 Wrapper 中唯一允许插入原始 SQL 片段的入口,也是绝大多数线上注入漏洞的源头:

Trancy
Trancy

Trancy是一款AI学习资源工具,AI驱动的语言学习工具。

下载
  • ❌ 危险写法:queryWrapper.apply("status = '" + statusParam + "'") —— 字符串拼接直接绕过预编译
  • ✅ 安全写法:queryWrapper.apply("status = {0}", statusParam) —— {0} 触发参数绑定,等同于 ?
  • ⚠️ 注意:{0} 只对参数值生效;字段名、表名、ORDER BY 方向等结构部分不能用占位符,必须白名单校验
  • 比如 queryWrapper.apply("ORDER BY {0} DESC", sortField) 不会生效,甚至可能报错或被忽略

动态字段名(如排序、查询字段)必须白名单校验

Wrapper 对字段名不做任何过滤,orderByAsc(sortField) 或 select(sortField) 中的 sortField 是直接拼进 SQL 的:

  • 前端传 sort=update_time; DROP TABLE user;-- → 最终生成 ORDER BY update_time; DROP TABLE user;--
  • 必须显式限制:if (!List.of("price", "create_time", "sales").contains(sortField)) { throw new IllegalArgumentException(); }
  • 更稳妥的方式是用 LambdaQueryWrapper + 方法引用:lambdaWrapper.orderByAsc(User::getPrice),彻底从源头规避字符串字段名

inSql 和 last 方法同样危险,规则一致

inSql 和 last 本质和 apply 同类,都属于“原始 SQL 插入口”:

  • queryWrapper.inSql("id", "SELECT goods_id FROM t_goods WHERE name LIKE '%" + keyword + "%'") —— 高危,完全拼接
  • 应改写为:queryWrapper.inSql("id", "SELECT goods_id FROM t_goods WHERE name LIKE {0}", "%" + keyword + "%"),且仅当子查询逻辑可控时才用
  • 更推荐:把子查询拆成两步,先查出 goodsIdList,再用 in 方法传集合 —— 完全走参数绑定
  • last 同理,避免 last("LIMIT " + limit),改用分页插件或 Page 对象

真正容易被忽略的不是“怎么写安全”,而是误以为“用了 Wrapper 就自动安全”。只要涉及字符串拼接、结构动态化、或绕过 eq/like 等标准方法,你就已经站在注入边界上了。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

sql注入

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2293

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1399

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

815

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

3172

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

5368

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1199

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

5631

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

4922

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

6554

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP开发基础之数据库篇(PDO)
PHP开发基础之数据库篇(PDO)

共10课时 | 2.3万人学习