`
小杨学JAVA
  • 浏览: 904207 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ibatis使用like进行模糊查询的时候,会有注入漏洞

阅读更多

看《ibatis in action》,里面提到了使用like进行模糊查询的时候,会有注入漏洞。举例说明如下:

 

Xml代码  收藏代码
  1. <select id="getSchoolByName" resultMap="result">  
  2.     select  
  3.           *  
  4.     from tbl_school  
  5.     where school_name like '%$name$%'  
  6. </select>  
 
Java代码  收藏代码
  1. public List<School> getSchoolByName(String name) throws DataAccessException {  
  2.     List<School> list = (List<School>)getSqlMapClientTemplate().queryForList("getSchoolByName",name);  
  3.     return list;  
  4. }  

     测试用例:

Java代码  收藏代码
  1. @Test  
  2. public void print(){  
  3.         try{  
  4.             List<School> list = schoolDao.getSchoolByName("长乐一中%' or '1%' = '1");  
  5.             for(School school : list){  
  6.                 System.out.println(school.getName());  
  7.             }  
  8.         }catch(Exception e){  
  9.             e.printStackTrace();  
  10.         }  
  11.     }  

    用p6spy查看最后生成的sql语句:

 

Sql代码  收藏代码
  1. sql1:select  * from tbl_school where school_name like '%长乐一中%' or '1%' = '1%'     
  2.   
  3. sql2:select  * from tbl_school where school_name like '%长乐一中%' or '1%' = '1%'  

     其中:sql1是ibatis放入preparedstatement执行的sql,sql2是jdbc执行的真正sql,在这个例子里二者一样的,因为在map里使用的占位符是$name$,ibatis遇到这样的占位符,就直接拼sql语句了,而不是用在sql中使用占位符再给sql set paramter(用#name#的话就是,但是不能用来搞模糊查询)。

 

    在实际项目中的后果就是:如果在页面上有个输入框,让用户输入学校名字,用户输入 长乐一中%' or '1%' = '1 的字样,那程序就会把所有的学校结果都列出来。实际上可能有一些学校已经被删除掉了(使用某个字段标记,假删除),不想让用户再看到或者某些学校信息当前用户没有权限看到。

 

    在《ibatis in action》里,例举了这个注入漏洞一个更可怕的后果,删表。修改测试用例如下:

Java代码  收藏代码
  1. @Test     
  2. public void print(){  
  3.         try{  
  4.             List<School> list = schoolDao.getSchoolByName("长乐一中';drop table tbl_test;#");  
  5.             for(School school : list){  
  6.                 System.out.println(school.getName());  
  7.             }  
  8.         }catch(Exception e){  
  9.             e.printStackTrace();  
  10.         }  
  11.     }  

    用p6spy查看最后生成的sql语句:

Sql代码  收藏代码
  1. select * from tbl_school where school_name like '%长乐一中';drop table tbl_test;#%'  
  2. select * from tbl_school where school_name like '%长乐一中';drop table tbl_test;#%'   

    在mysql中,#是注释符.复制以下sql代码在phpmyadmin中执行,tbl_test确实被删掉了。但是用ibatis执行这句sql却失败,debug了下ibatis的源代码,发现ibatis是用preparedstatement执行查询的。上面的是两个sql语句,但ibatis直接把“select * from tbl_school where school_name like '%长乐一中';drop table tbl_test;#%'”这句sql放进去执行,差不多下面这样:

Java代码  收藏代码
  1. String sql = "select * from tbl_school where school_name like '%长乐一中';drop table tbl_test;#%'"  
  2.   
  3. PreparedStatement ps = conn.prepareStatement(sql);  
  4.   
  5. ps.execute();  

    这样的执行就会报错,也就删除不了tbl_test这张表了。。。奇怪了。。难道《ibatis in action》这书上讲错了?

    以上代码都是在ibatis2.3.4的环境下测试的。没试过以前的版本。。

 

    但是在使用ibatis的时候难道就不能like查询了?或者要在web层或者service层对用户的输入条件作一次过滤么?太麻烦了。还好ibatis提供的另一种占位符#在用PreparedStatement执行查询的时候,是用?作占位符,然后set paramter的。。把map里的sql语句改成这样吧:(参考了网上的sql语句)

Sql代码  收藏代码
  1. mysql: select * from tbl_school where school_name like concat('%',#name#,'%')  
  2.   
  3. oracle: select * from tbl_school where school_name like '%'||#name#||'%'  
  4.   
  5. SQL Server:select * from tbl_school where school_name like '%'+#name#+'%' 

分享到:
评论

相关推荐

    iBATIS模糊查询

    1. 防止SQL注入攻击:在使用iBATIS进行模糊查询时,需要确保参数的安全性,以防止SQL注入攻击。例如,以下代码是错误的: ```sql SELECT * FROM t_stu WHERE s_name LIKE '%$name$%' ``` 这种代码容易受到SQL注入...

    IBatis完成单表基本的数据库操作 模糊查询

    标题 "IBatis完成单表基本的数据库操作 模糊查询" 涉及到的是使用iBatis这个轻量级的持久层框架进行数据库的基本操作,特别是模糊查询。iBatis是一个优秀的SQL映射框架,它允许开发者将SQL语句与Java代码分离,提高...

    07_ibatis教程_模糊查询实体对象.rar )

    本教程主要聚焦于Ibatis如何进行模糊查询实体对象,这对于数据检索和筛选至关重要。 Ibatis,全称为MyBatis,是一个支持定制化SQL、存储过程以及高级映射的Java持久层框架。它避免了几乎所有的JDBC代码和手动设置...

    07_ibatis教程_模糊查询实体对象.zip

    在本教程"07_ibatis教程_模糊查询实体对象"中,我们将深入学习如何使用iBatis这个流行的Java持久层框架进行模糊查询操作,尤其是在处理实体对象时。iBatis作为一个轻量级的ORM(Object-Relational Mapping)工具,它...

    操作数据库 iBATIS查询

    当需要执行一个模糊查询时,通常会使用`LIKE`关键字配合通配符`%`。例如,以下SQL语句将查询所有姓“张”的学生: ```sql SELECT * FROM T_STUDENT WHERE S_NAME LIKE '张%'; ``` 在iBATIS中,可以使用类似的方法...

    ibatis 使用手册

    开发指南会深入讲解如何初始化iBatis环境,包括设置配置文件、创建SqlMap文件、设计Mapper接口以及如何在Java代码中使用这些组件。此外,还会介绍如何处理结果集、执行批量操作、使用缓存机制等高级特性。 **iBatis...

    ibatis的实现(包含模糊查询、关联查询、增删改查)

    本篇将详细讲解Ibatis在实现模糊查询、关联查询以及增删改查操作时的关键知识点。 首先,模糊查询是数据库操作中常见的功能,Ibatis通过`&lt;if&gt;`标签或`&lt;where&gt;`标签配合`#{}`占位符来实现。例如,如果你有一个用户...

    ibatis的动态查询

    以上内容详细介绍了 ibatis 中动态查询的基本原理及具体实现方法,包括模糊查询、多条件组合查询以及使用 Map 作为参数的高级用法。这些知识点对于深入理解 ibatis 的动态查询机制非常重要,可以帮助开发者更高效地...

    ibatis总结 ibatis ibatis ibatis ibatis

    - 在编写SQL时,应避免使用全模糊匹配`LIKE '%text%'`,而应尽可能使用带有前缀或后缀的模糊匹配,如`LIKE 'text%'`,这可以显著提升查询效率。 - 使用`EXISTS`子查询通常比直接关联查询更高效,尤其是在数据量大...

    ibatis的使用教程

    要开始使用 Ibatis,首先需要从官方网站下载最新版本的 ibatis jar 包,以及 log4j 日志框架的 jar 包。然后,在Java项目中添加这些库,配置log4j.properties以开启SQL日志输出。接着,新建主配置文件sqlMapConfig....

    ibatis多表查询

    在这个例子中,我们将探讨如何使用Ibatis进行一对多的多表查询,以`book`和`user`两个表为例。 首先,我们有两个表:`book`和`user`。`book`表存储书籍信息,包含`oid`(主键)和`name`字段。`user`表存储用户信息,...

    ibatis3中使用jpa的方法进行查询

    在Spring环境中,你可以使用`@Repository`注解标记Mapper接口,然后通过@Autowired注解注入到Service层,这样就可以在Service中直接调用Mapper接口进行查询。 虽然Ibatis3本身并不直接支持JPA,但通过这种方式,...

    ibatis 之分页

    在分页查询方面,Ibatis允许我们在SQL语句中直接添加LIMIT和OFFSET子句,或者使用自定义的分页插件来实现。 1. **SQL映射分页**:在Ibatis的XML配置文件中,我们可以直接编写包含分页条件的SQL语句。例如,对于...

    ibatis 相关使用文档及安装包ibatis 相关使用文档及安装包

    《iBATIS-SqlMaps-2.pdf》可能是关于iBATIS SQL映射器的详细指南,它会介绍如何编写SQL Map配置文件,这些文件定义了数据库查询和事务处理。SQL Maps是iBATIS的核心部分,它们将数据库查询与Java对象绑定,使得...

    ibatis下oracle树查询

    例如,假设我们有一个部门表DEPARTMENTS,包含ID(主键)、PARENT_ID(父ID)和NAME(部门名称)字段,可以使用以下SQL语句进行树形查询: ```sql SELECT level, connect_by_root id AS root_id, id, name FROM ...

    ibatis_动态查询条件

    iBatis 动态查询条件...* 在使用 iBatis 的动态查询条件时,需要注意 SQL 注入问题。 iBatis 的动态查询条件提供了强大的功能,可以根据不同的参数生成不同的 SQL 语句,使得开发者可以更方便地实现复杂的查询逻辑。

    Ibatis多表查询

    在实际使用中,我们可以通过 Ibatis 的 SqlSession 对象来执行查询。例如,调用 `sqlSession.selectList("selectAllBooks")` 将返回一个 `Book` 对象的列表,每个 `Book` 对象的 `users` 列表已经填充了对应的作者...

    ibatis and和or联合查询 .doc

    ### ibatis and和or联合查询知识点 #### 一、ibatis简介 ibatis是一个支持普通SQL查询、存储过程以及高级映射的优秀开源数据访问框架。ibatis消除了几乎所有的JDBC对象操作,提供了一个简单的基本API,它通过XML或...

    ibatis中使用安全的拼接语句,动态查询,大于、小于、等于.doc

    iBatis 中使用安全的拼接语句、动态查询、大于、小于、等于 iBatis 是一个流行的持久层框架,提供了许多强大的功能来帮助开发者构建高效、安全的数据库交互应用程序。本文将详细介绍 iBatis 中使用安全的拼接语句、...

    ibatis动态多条件组合查询

    ibatis动态多条件组合查询 实例 说明

Global site tag (gtag.js) - Google Analytics