聊一聊MyBatis 和 SQL 注入间的恩恩怨怨
2020/3/4 17:01:23
本文主要是介绍聊一聊MyBatis 和 SQL 注入间的恩恩怨怨,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
整理了一些Java方面的架构、面试资料(微服务、集群、分布式、中间件等),有需要的小伙伴可以关注公众号【程序员内点事】,无套路自行领取
更多优选
- 一口气说出 9种 分布式ID生成方式,面试官有点懵了
- 面试总被问分库分表怎么办?你可以这样怼他
- 3万字总结,Mysql优化之精髓
- 为了不复制粘贴,我被逼着学会了JAVA爬虫
- 技术部突然宣布:JAVA开发人员全部要会接口自动化测试框架
- Redis 5种数据结构及对应使用场景,全会面试要加分的
引言
MyBatis
是一种持久层框架,介于 JDBC
和 Hibernate
之间。通过 MyBatis 减少了手写 SQL 语句的痛苦,使用者可以灵活使用 SQL 语句,支持高级映射。但是 MyBatis 的推出不是只是为了安全问题,有很多开发认为使用了 MyBatis 就不会存在 SQL 注入了,真的是这样吗?
使用了 MyBatis 就不会有 SQL 注入了吗? 答案很明显是 NO。 MyBatis它只是一种持久层框架,它并不会为你解决安全问题。当然,如果你能够遵循规范,按照框架推荐的方法开发,自然也就避免 SQL 注入问题了。本文就将 MyBatis 和 SQL 注入这些恩恩怨怨掰扯掰扯。(注本文所说的 MyBatis 默认指的是 Mybatis3)
技术背景
写本文的起源主要是来源于内网发现的一次 SQL 注入。我们发现内网的一个请求的 keyword
参数存在 SQL 注入,简单地介绍一下需求背景。
基本上这个接口就是实现多个字段可以实现 keyword 的模糊查询,这应该是一个比较常见的需求。只不过这里存在多个查询条件。经过一番搜索,我们发现问题的核心处于以下代码:
public Criteria addKeywordTo(String keyword) { StringBuilder sb = new StringBuilder(); sb.append("(display_name like '%" + keyword + "%' or "); sb.append("org like '" + keyword + "%' or "); sb.append("status like '%" + keyword + "%' or "); sb.append("id like '" + keyword + "%') "); addCriterion(sb.toString()); return (Criteria) this; } 复制代码
很明显,需求是希望实现 diaplay_name
, org
,status
以及 id
的模糊查询,但开发在这里自己创建了一个 addKeywordTo
方法,通过这个方法创建了一个涉及多个字段的模糊查询条件。
有一个有趣的现象,在内网发现的绝大多数 SQL 注入的注入点,基本都是模糊查询
的地方。可能很多开发往往觉得模糊查询是不是就不会存在 SQL 注入的问题。
分析一下这个开发为什么会这么写,在他没有意识到这样的写法存在 SQL 注入问题的时候,这样的写法他可能认为是最省事的,到时直接把查询条件拼进去就可以了。以上代码是问题的核心,我们再看一下对应的 xml 文件:
<sql id="Example_Where_Clause" > <where > <foreach collection="oredCriteria" item="criteria" separator="or" > <if test="criteria.valid" > <trim prefix="(" suffix=")" prefixOverrides="and" > <foreach collection="criteria.criteria" item="criterion" > <choose > <when test="criterion.noValue" > and ${criterion.condition} </when> <when
这篇关于聊一聊MyBatis 和 SQL 注入间的恩恩怨怨的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-01基于Python+Vue开发的医院门诊预约挂号系统
- 2024-10-01基于Python+Vue开发的旅游景区管理系统
- 2024-10-01RestfulAPI入门指南:打造简单易懂的API接口
- 2024-10-01初学者指南:了解和使用Server Action
- 2024-10-01Server Component入门指南:搭建与配置详解
- 2024-10-01React 中使用 useRequest 实现数据请求
- 2024-10-01使用 golang 将ETH账户的资产平均分散到其他账户
- 2024-10-01JWT用户校验课程:从入门到实践
- 2024-10-01Server Component课程入门指南
- 2024-09-30Dnd-Kit学习:新手快速入门指南