MyBatis Plus 防御机制浅析(一)
字数 1345 2025-08-18 11:36:48
MyBatis Plus SQL注入防御机制详解
1. 背景介绍
MyBatis-Plus是一个强大的MyBatis增强工具包,旨在简化开发。它提供了许多高效、实用、开箱即用的功能,可以有效地节省开发时间。但在使用过程中,开发者需要了解其SQL注入防御机制,以确保应用安全。
2. 测试环境配置
- MySQL版本:8.0.35
- MyBatis-Plus版本:3.5.4 (mybatis-plus-spring-boot3-starter)
- 日志配置:开启SQL日志便于观察
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
3. SQL注入测试案例
3.1 直接SQL注入测试
在MySQL控制台直接执行含有注入payload的语句:
insert into sys_user (id, name, age, email)
values (124,'Jasdf',42,'asdf@x.com');/**/DROP/**/TABLE/**/sys_user;25,'joh@asdf.com');
结果:sys_user表被成功删除,证明该SQL语句确实存在注入漏洞。
3.2 通过MyBatis Plus执行测试
将恶意payload放入参数name中:
String name = "Jasdf',42,'asdf@x.com');/**/DROP/**/TABLE/**/sys_user;";
观察MyBatis Plus处理后的SQL:
INSERT INTO sys_user (id, name, age, email)
VALUES (#{id}, #{name}, #{age}, #{email})
结果:payload作为完整的String被插入数据库,注入未成功。
4. MyBatis Plus防御机制解析
4.1 SQL模板解析
MyBatis Plus首先将SQL语句解析为模板+数据的形式:
INSERT INTO sys_user (id, name, age, email)
VALUES (#{id}, #{name}, #{age}, #{email})
与${value}不同,#{value}形式的变量会参与预编译。
4.2 PreparedStatement机制
- 预编译阶段:SQL语句被发送到数据库进行预编译
- 参数绑定阶段:参数值随后单独发送到数据库
关键点:
- 参数值不会被解析为SQL语法
- 数据库知道这些值只是数据,不是可执行代码
4.3 字符串类型处理
对于String类型的参数(如name字段),MyBatis Plus会:
- 调用
ps.setString(i, parameter)方法 - 该方法自动处理特殊字符的转义:
- 单引号
'被转义为'' - 其他特殊字符如
\u0000,\n,\r等也会被适当转义
- 单引号
最终生成的SQL语句:
INSERT INTO sys_user (id, name, age, email)
VALUES (1744564513751109634, 'Jasdf'',42,''asdf@x.com'');/**/DROP/**/TABLE/**/sys_user;3, 'abc@mp.com')
对比原始payload:
Jasdf',42,'asdf@x.com');/**/DROP/**/TABLE/**/sys_user;
变为:
Jasdf'',42,''asdf@x.com'');/**/DROP/**/TABLE/**/sys_user;
4.4 防御原理总结
- 参数化查询:使用
#{}占位符而非字符串拼接 - 预编译机制:SQL语句与参数分离
- 自动转义:对字符串类型参数自动进行特殊字符转义
- 类型安全:根据参数类型进行适当的处理
5. 注意事项
虽然MyBatis Plus提供了良好的SQL注入防御机制,但开发者仍需注意:
- 避免直接使用
${}进行字符串拼接 - 对于复杂SQL,仍需注意参数处理
- 动态表名、列名等场景需要特殊处理
- XML映射文件中需正确使用
#{}语法
6. 最佳实践
- 始终优先使用
#{}语法 - 对于必须使用
${}的场景,确保参数值可信或经过严格过滤 - 开启SQL日志监控,定期检查生成的SQL语句
- 保持MyBatis Plus版本更新,获取最新的安全修复
7. 总结
MyBatis Plus通过以下机制有效防御SQL注入:
- 强制使用参数化查询(
#{}语法) - 基于PreparedStatement的预编译机制
- 自动的类型处理和特殊字符转义
- SQL语句与参数的严格分离
这些机制共同作用,使得在正常使用MyBatis Plus时能够有效防止大多数SQL注入攻击。然而,安全是一个持续的过程,开发者仍需保持警惕,遵循安全编码实践。