整理了一些Java方面的架构、面试资料(微服务、集群、分布式、中间件等),有需要的小伙伴可以关注公众号【程序员内点事】,无套路自行领取
更多优选
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 注入间的恩恩怨怨的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!