Mybatis like 查询 防止SQL注入方法相关原理和解决方法整理

SQL注入:引自百度百科:

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。[1]  比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击

mybatis中的#和$的区别 :点击打开链接

 主题:ibatis中,关于$和#的微妙关系 点击打开链接

Mybatis3 防止SQL注入 点击打开链接


#{xxx},使用的是PreparedStatement,会有类型转换,所以比较安全;
${xxx},使用字符串拼接,可以SQL注入;
like查询不小心会有漏动,正确写法如下:
Mysql: select * from t_user where name like concat('%', #{name}, '%')  

### MyBatis-Plus 中防止 Like 查询 SQL 注入的最佳实践 在开发过程中,SQL 注入是一个常见的安全威胁。对于像 `LIKE` 这样的查询操作,如果参数未经过适当处理,则可能成为攻击者利用的漏洞。以下是关于如何在 MyBatis-Plus 中有效预防处理 `LIKE` 查询中的 SQL 注入问题的方法。 #### 使用预编译语句 MyBatis MyBatis-Plus 提供了内置的支持来通过预编译语句(PreparedStatement)自动转义特殊字符,从而减少手动编码的工作量并增强安全性。当使用动态 SQL 或条件构建器时,框架会自动生成带有占位符 (`?`) 的 SQL 语句[^1]。这可以确保传入的数据不会被解释为 SQL 片段的一部分。 ```java @Mapper public interface UserMapper extends BaseMapper<User> { @Select("SELECT * FROM user WHERE name LIKE CONCAT('%', #{name}, '%')") List<User> selectByNameLike(@Param("name") String name); } ``` 上述代码片段展示了如何通过 `#{}` 占位符绑定变量到 SQL 参数中,而不是直接拼接字符串。这种方式能够显著降低注入风险[^2]。 #### 利用 Wrapper 条件构造工具类 MyBatis-Plus 提供了一个强大的 API——Wrapper 接口及其子接口 QueryWrapper UpdateWrapper,用于简化复杂的查询逻辑编写过程。这些工具可以帮助开发者更方便地实现模糊匹配功能的同时也提供了更高的安全保障: ```java QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.like("name", userInput).or().like("email", userInput); List<User> users = userMapper.selectList(wrapper); ``` 这里的关键在于,无论何时调用了诸如 `.like()` 方法,内部都会采用安全的方式传递数据给数据库引擎执行[^3]。 #### 手动清理输入 尽管现代 ORM 已经极大地减少了手写原始 SQL 的需求,但在某些情况下仍然不可避免要这样做。此时就需要特别注意对用户提交的内容进行额外验证与过滤。可以通过 Java 自带或者第三方库完成这一任务,比如 Apache Commons Lang 库下的 `StringEscapeUtils.escapeSql()` 函数[^4]: ```java import org.apache.commons.text.StringEscapeUtils; // 假设这是来自用户的不可信输入 String unsafeInput = request.getParameter("search"); // 转义潜在危险字符 String safeSearchTerm = "%" + StringEscapeUtils.escapeSql(unsafeInput) + "%"; ``` 不过需要注意的是,在大多数场景下推荐优先考虑前面提到的技术手段而非依赖于这种显式的转换方法,因为后者容易遗漏边界情况而导致隐患残留。 #### 配置全局拦截器 为了进一步加强防护措施,还可以定义一个通用的插件层用来捕获所有的请求并对其中涉及敏感字段的部分实施统一校验策略。例如创建一个基于 AspectJ AOP 的切面程序专门针对所有 DAO 层的操作加以审查[^5]。 --- ### 总结 综上所述,最佳实践中应尽可能依靠框架本身的能力去规避风险源;同时也要养成良好的编程习惯,如严格限定外部交互界面可接受的形式范围以及定期复查现有业务是否存在薄弱环节等问题所在之处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值