Java教程

聊一聊MyBatis 和 SQL 注入间的恩恩怨怨

本文主要是介绍聊一聊MyBatis 和 SQL 注入间的恩恩怨怨,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

整理了一些Java方面的架构、面试资料(微服务、集群、分布式、中间件等),有需要的小伙伴可以关注公众号【程序员内点事】,无套路自行领取

更多优选

引言

MyBatis 是一种持久层框架,介于 JDBCHibernate 之间。通过 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_nameorgstatus 以及 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 注入间的恩恩怨怨的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!