前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mybatis 学习笔记(二):mybatis SQL注入问题

mybatis 学习笔记(二):mybatis SQL注入问题

作者头像
希希里之海
发布2018-08-30 15:38:00
1.6K0
发布2018-08-30 15:38:00
举报
文章被收录于专栏:weixuqin 的专栏weixuqin 的专栏

mybatis 学习笔记(二):mybatis SQL注入问题

SQL 注入攻击

首先了解下概念,什么叫SQL 注入:

SQL注入攻击,简称SQL攻击或注入攻击,是发生于应用程序之数据库层的安全漏洞。简而言之,是在输入的字符串之中注入SQL指令,在设计不良的程序当中忽略了检查,那么这些注入进去的指令就会被数据库服务器误认为是正常的SQL指令而运行,因此遭到破坏或是入侵。

最常见的就是我们在应用程序中使用字符串联结方式组合 SQL 指令,有心之人就会写一些特殊的符号,恶意篡改原本的 SQL 语法的作用,达到注入攻击的目的。

举个栗子:

比如验证用户登录需要 username 和 password,编写的 SQL 语句如下:

代码语言:javascript
复制
select * from user where (name = '"+ username +"') and (pw = '"+ password +"');

username 和 password 字段被恶意填入

代码语言:javascript
复制
username = "1' OR '1'='1";

代码语言:javascript
复制
password = "1' OR '1'='1";

将导致原本的 SQL 字符串被填为:

代码语言:javascript
复制
select * from user where (name = '1' or '1'='1') and (pw = '1' or '1'='1');

实际上运行的 SQL 语句将变成:

代码语言:javascript
复制
select * from user;

也就是不再需要 username 和 password 账密即达到登录的目的,结果不言而喻。

mybatis 解决 SQL 注入问题

我们使用 mybatis 编写 SQL 语句时,难免会使用模糊查询的方法,mybatis 提供了两种方式 #{}${}

  • #{value} 在预处理时,会把参数部分用一个占位符 ? 替代,其中 value 表示接受输入参数的名称。能有效解决 SQL 注入问题
  • ${} 表示使用拼接字符串,将接受到参数的内容不加任何修饰符拼接在 SQL 中,使用${}拼接 sql,将引起 SQL 注入问题。

举个栗子:

1 查询数据库 sample 表 user 中的记录,我们故意使用特殊符号,看能否引起 SQL 注入。使用 mybatis 在 mapper.xml 配置文件中编写 SQL 语句,我们先采用拼接字符串形式,看看结果如何:

代码语言:javascript
复制
 <select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User">
        <!-- 拼接 MySQL,引起 SQL 注入 -->
        SELECT * FROM user WHERE username LIKE '%${value}%'
    </select>

注意在配置文件中编写 SQL 语句时,后边不需要加分号。

调用配置文件,编写测试文件,查询数据库内容,采用特殊符号,引起 SQL 注入:

代码语言:javascript
复制
    @Test
    public void testFindUserByName() throws Exception{

        SqlSession sqlSession=sqlSessionFactory.openSession();

        //创建UserMapper代理对象
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);

        //调用userMapper的方法
        List<User> list=userMapper.findUserByName("' or '1'='1");

        sqlSession.close();

        System.out.println(list);
    }
}

运行结果如下图所示:

可以看到执行语句其实变为了

代码语言:javascript
复制
select * from user

将user 表中的全部记录打印出来了。发生了 SQL 注入。

2 如果将配置文件中的 SQL 语句改成 #{} 形式,可避免 SQL 注入。

代码语言:javascript
复制
 <select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User">
        <!-- 使用 SQL concat 语句,拼接字符串,防止 SQL 注入 -->
        SELECT * FROM USER WHERE username LIKE CONCAT('%',#{value},'%' )
    </select>

再次运行测试程序,控制台输出如下:

可以看到程序中参数部分用 ? 替代了,很好地解决了 SQL 语句的问题,防止了 SQL 注入。查询结果将为空。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-08-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • mybatis 学习笔记(二):mybatis SQL注入问题
    • SQL 注入攻击
      • mybatis 解决 SQL 注入问题
      相关产品与服务
      数据库
      云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档