看《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#+'%'
分享到:
相关推荐
当需要执行一个模糊查询时,通常会使用`LIKE`关键字配合通配符`%`。例如,以下SQL语句将查询所有姓“张”的学生: ```sql SELECT * FROM T_STUDENT WHERE S_NAME LIKE '张%'; ``` 在iBATIS中,可以使用类似的方法...
这篇博客“iBatis执行非查询语句(CRUD,函数和过程)”深入探讨了如何在iBatis中执行创建、读取、更新和删除(CRUD)操作,以及调用数据库存储过程和函数。 一、iBatis简介 iBatis最初由MyBatis的创始人Clinton ...
这是通过 Ibatis 自动执行 `getUsersByBookId` 查询并填充结果到 `users` 列表实现的。 总结来说,Ibatis 多表查询的关键在于正确配置 `resultMap` 和 `select` 语句,以及确保 Pojo 类能够反映数据库的结构。通过...
1. 防止SQL注入攻击:在使用iBATIS进行模糊查询时,需要确保参数的安全性,以防止SQL注入攻击。例如,以下代码是错误的: ```sql SELECT * FROM t_stu WHERE s_name LIKE '%$name$%' ``` 这种代码容易受到SQL注入...
在运行时,Ibatis会根据配置自动执行SQL,将结果映射到Java对象,从而简化了数据库操作,提高了代码的可维护性和可读性。在实际开发中,我们可以根据具体需求调整配置,实现不同复杂度的多表查询。
iBatis 动态查询条件...* 在使用 iBatis 的动态查询条件时,需要注意 SQL 注入问题。 iBatis 的动态查询条件提供了强大的功能,可以根据不同的参数生成不同的 SQL 语句,使得开发者可以更方便地实现复杂的查询逻辑。
**知识点1:** 在进行模糊查询时,ibatis支持两种不同的语法标记:`#` 和 `$`。 1. **使用 `$value$` 进行模糊查询:** - 在进行模糊查询时,使用 `$value$` 的方式更为安全且易于实现。 - 正确的语法应为 `name ...
在查询指定id的单个对象时,Ibatis提供了`<select>`标签,用于定义SQL查询。标签内可以设置id属性,对应Mapper接口中的方法名,resultType或resultMap属性则定义返回结果的类型或者映射关系。 ```xml SELECT * ...
在进行连接查询时,iBatis允许我们在Mapper XML文件中编写自定义的JOIN语句,或者通过动态SQL来实现。 1. **配置环境**: 在使用iBatis进行连接查询之前,确保已经正确地配置了iBatis的环境,包括MyBatis的核心库...
在本话题中,我们将探讨如何在使用iBatis框架与Oracle数据库时实现树形查询。 首先,iBatis是一个优秀的持久层框架,它允许开发者将SQL语句直接写在XML配置文件或者注解中,提供了比传统JDBC更高级的抽象层,使得...
- 在编写SQL时,应避免使用全模糊匹配`LIKE '%text%'`,而应尽可能使用带有前缀或后缀的模糊匹配,如`LIKE 'text%'`,这可以显著提升查询效率。 - 使用`EXISTS`子查询通常比直接关联查询更高效,尤其是在数据量大...
在Spring框架中,可以使用`@Autowired`注解将SqlSessionTemplate或SqlSessionFactory注入到服务层,方便进行iBatis的事务管理和查询操作。 ### 11. 示例 以下是一个多表查询的XML映射文件示例: ```xml SELECT *...
这里`#{name}`和`#{minAge}`就是占位符,iBatis会在执行时将它们替换为实际的值。 此外,资源中的"按条件查询三国数据库"可能包含了一个基于三国历史数据的示例,这有助于开发者更好地理解和实践iBatis的条件查询...
在Ibatis中,复杂查询通常涉及到多个表的联接、条件动态拼接、子查询以及各种数据类型的处理。文档"Ibatis复杂查询语句.doc"所展示的查询语句就是一个很好的例子,展示了Ibatis如何处理复杂的数据库操作。接下来,...
iBATIS不仅限于查询,还支持插入、更新、删除等SQL语句的执行。同时,可以通过配置文件进行DDL操作,例如创建、修改或删除数据库表结构。 6. **处理极大的数据集** 对于大规模数据的处理,iBATIS提供了分页查询、...
在Ibatis中,动态SQL是指在执行SQL语句时根据不同的条件动态地构造SQL语句。这在实际开发中非常有用,因为可以避免硬编码SQL语句,提高代码的可维护性和灵活性。 #### `<isGreaterThan>`元素 ```xml <![CDATA[( ...
在控制台打印主子表查询结果时,可以利用log4j的`Logger`类,设置合适的日志级别(如DEBUG),并在查询执行后调用`info()`或`debug()`方法,将查询结果输出到控制台。确保在项目配置中添加了log4j.properties文件,...
动态查询语句配置是Ibatis的一个重要特性,它允许我们在运行时根据业务需求构建灵活多变的SQL语句。这篇博文主要探讨的是如何在Ibatis中设置和使用动态SQL,以便实现更高效、更灵活的数据查询。 首先,我们需要理解...
- `<otherwise>`:`<choose>`的子元素,当所有`<when>`都不匹配时执行。 这些元素的`prepend`属性用于在SQL语句的相应位置插入SQL片段,`property`属性用于指定比较的属性,而`compareValue`或`compareProperty`...