java编程学习笔记——mybatis SQL注入问题

SQL 注入攻击

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

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

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

  举个栗子:

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

  select * from user where (name = '"+ username +"') and (pw = '"+ password +"');

  username 和 password 字段被恶意填入

  username = "1' OR '1'='1";

  与

  password = "1' OR '1'='1";

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

  select * from user where (name = '1' or '1'='1') and (pw = '1' or '1'='1');

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

  select * from user;

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

mybatis 解决 SQL 注入问题

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

#{value}在预处理时,会把参数部分用一个占位符 ? 替代,其中 value 表示接受输入参数的名称。能有效解决 SQL 注入问题

${}表示使用拼接字符串,将接受到参数的内容不加任何修饰符拼接在 SQL 中,使用${}拼接 sql,将引起 SQL 注入问题。

  举个栗子:

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

   SELECT * FROM user WHERE username LIKE '%${value}%'

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

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

  @Test public void testFindUserByName() throws Exception{ SqlSession sqlSession=sqlSessionFactory.openSession(); //创建UserMapper代理对象 UserMapper userMapper=sqlSession.getMapper(UserMapper.class); //调用userMapper的方法 List list=userMapper.findUserByName("' or '1'='1"); sqlSession.close(); System.out.println(list); } }

  运行结果如下图所示:

13638982-cf0fe1b792d8d81c.png

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

  select * from user

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

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

   SELECT * FROM USER WHERE username LIKE CONCAT('%',#{value},'%' )

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

13638982-29d662a6fcf80aaf.png

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

喜欢的点个关注,点个赞。

 程序员学习交流群:878249276,欢迎一到五年的工程师加入,合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值