`
asael
  • 浏览: 34247 次
  • 性别: Icon_minigender_1
  • 来自: 福建省福州
社区版块
存档分类
最新评论

ibatis执行like查询时要注意注入漏洞

    博客分类:
  • j2ee
阅读更多

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

 

<select id="getSchoolByName" resultMap="result">
    select
          *
    from tbl_school
    where school_name like '%$name$%'
</select>
 
public List<School> getSchoolByName(String name) throws DataAccessException {
	List<School> list = (List<School>)getSqlMapClientTemplate().queryForList("getSchoolByName",name);
	return list;
}

     测试用例:

@Test
public void print(){
		try{
			List<School> list = schoolDao.getSchoolByName("长乐一中%' or '1%' = '1");
			for(School school : list){
				System.out.println(school.getName());
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}

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

 

sql1:select  * from tbl_school where school_name like '%长乐一中%' or '1%' = '1%'   

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》里,例举了这个注入漏洞一个更可怕的后果,删表。修改测试用例如下:

@Test	
public void print(){
		try{
			List<School> list = schoolDao.getSchoolByName("长乐一中';drop table tbl_test;#");
			for(School school : list){
				System.out.println(school.getName());
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}

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

select * from tbl_school where school_name like '%长乐一中';drop table tbl_test;#%'
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放进去执行,差不多下面这样:

String sql = "select * from tbl_school where school_name like '%长乐一中';drop table tbl_test;#%'"

PreparedStatement ps = conn.prepareStatement(sql);

ps.execute();

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

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

 

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

mysql: select * from tbl_school where school_name like concat('%',#name#,'%')

oracle: select * from tbl_school where school_name like '%'||#name#||'%'

SQL Server:select * from tbl_school where school_name like '%'+#name#+'%'
 

 

 

分享到:
评论

相关推荐

    操作数据库 iBATIS查询

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

    iBatis执行非查询语句(CRUD,函数和过程)

    这篇博客“iBatis执行非查询语句(CRUD,函数和过程)”深入探讨了如何在iBatis中执行创建、读取、更新和删除(CRUD)操作,以及调用数据库存储过程和函数。 一、iBatis简介 iBatis最初由MyBatis的创始人Clinton ...

    Ibatis多表查询

    这是通过 Ibatis 自动执行 `getUsersByBookId` 查询并填充结果到 `users` 列表实现的。 总结来说,Ibatis 多表查询的关键在于正确配置 `resultMap` 和 `select` 语句,以及确保 Pojo 类能够反映数据库的结构。通过...

    iBATIS模糊查询

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

    ibatis多表查询

    在运行时,Ibatis会根据配置自动执行SQL,将结果映射到Java对象,从而简化了数据库操作,提高了代码的可维护性和可读性。在实际开发中,我们可以根据具体需求调整配置,实现不同复杂度的多表查询。

    ibatis_动态查询条件

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

    ibatis的动态查询

    **知识点1:** 在进行模糊查询时,ibatis支持两种不同的语法标记:`#` 和 `$`。 1. **使用 `$value$` 进行模糊查询:** - 在进行模糊查询时,使用 `$value$` 的方式更为安全且易于实现。 - 正确的语法应为 `name ...

    ibatis教程_查询指定id的单个对象

    在查询指定id的单个对象时,Ibatis提供了`&lt;select&gt;`标签,用于定义SQL查询。标签内可以设置id属性,对应Mapper接口中的方法名,resultType或resultMap属性则定义返回结果的类型或者映射关系。 ```xml SELECT * ...

    ibatis做连接查询 .doc

    在进行连接查询时,iBatis允许我们在Mapper XML文件中编写自定义的JOIN语句,或者通过动态SQL来实现。 1. **配置环境**: 在使用iBatis进行连接查询之前,确保已经正确地配置了iBatis的环境,包括MyBatis的核心库...

    ibatis下oracle树查询

    在本话题中,我们将探讨如何在使用iBatis框架与Oracle数据库时实现树形查询。 首先,iBatis是一个优秀的持久层框架,它允许开发者将SQL语句直接写在XML配置文件或者注解中,提供了比传统JDBC更高级的抽象层,使得...

    ibatis总结 ibatis ibatis ibatis ibatis

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

    ibatis多表查询过程

    在Spring框架中,可以使用`@Autowired`注解将SqlSessionTemplate或SqlSessionFactory注入到服务层,方便进行iBatis的事务管理和查询操作。 ### 11. 示例 以下是一个多表查询的XML映射文件示例: ```xml SELECT *...

    iBatis条件查询

    这里`#{name}`和`#{minAge}`就是占位符,iBatis会在执行时将它们替换为实际的值。 此外,资源中的"按条件查询三国数据库"可能包含了一个基于三国历史数据的示例,这有助于开发者更好地理解和实践iBatis的条件查询...

    Ibatis复杂查询语句.doc

    在Ibatis中,复杂查询通常涉及到多个表的联接、条件动态拼接、子查询以及各种数据类型的处理。文档"Ibatis复杂查询语句.doc"所展示的查询语句就是一个很好的例子,展示了Ibatis如何处理复杂的数据库操作。接下来,...

    ibatis 文档查询

    iBATIS不仅限于查询,还支持插入、更新、删除等SQL语句的执行。同时,可以通过配置文件进行DDL操作,例如创建、修改或删除数据库表结构。 6. **处理极大的数据集** 对于大规模数据的处理,iBATIS提供了分页查询、...

    Ibatis查询Id列表.doc

    在Ibatis中,动态SQL是指在执行SQL语句时根据不同的条件动态地构造SQL语句。这在实际开发中非常有用,因为可以避免硬编码SQL语句,提高代码的可维护性和灵活性。 #### `&lt;isGreaterThan&gt;`元素 ```xml &lt;![CDATA[( ...

    主子表查询ibatis

    在控制台打印主子表查询结果时,可以利用log4j的`Logger`类,设置合适的日志级别(如DEBUG),并在查询执行后调用`info()`或`debug()`方法,将查询结果输出到控制台。确保在项目配置中添加了log4j.properties文件,...

    动态ibatis查询语句配置

    动态查询语句配置是Ibatis的一个重要特性,它允许我们在运行时根据业务需求构建灵活多变的SQL语句。这篇博文主要探讨的是如何在Ibatis中设置和使用动态SQL,以便实现更高效、更灵活的数据查询。 首先,我们需要理解...

    ibatis动态注入

    - `&lt;otherwise&gt;`:`&lt;choose&gt;`的子元素,当所有`&lt;when&gt;`都不匹配时执行。 这些元素的`prepend`属性用于在SQL语句的相应位置插入SQL片段,`property`属性用于指定比较的属性,而`compareValue`或`compareProperty`...

Global site tag (gtag.js) - Google Analytics