看《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#+'%'
分享到:
相关推荐
1. 防止SQL注入攻击:在使用iBATIS进行模糊查询时,需要确保参数的安全性,以防止SQL注入攻击。例如,以下代码是错误的: ```sql SELECT * FROM t_stu WHERE s_name LIKE '%$name$%' ``` 这种代码容易受到SQL注入...
标题 "IBatis完成单表基本的数据库操作 模糊查询" 涉及到的是使用iBatis这个轻量级的持久层框架进行数据库的基本操作,特别是模糊查询。iBatis是一个优秀的SQL映射框架,它允许开发者将SQL语句与Java代码分离,提高...
本教程主要聚焦于Ibatis如何进行模糊查询实体对象,这对于数据检索和筛选至关重要。 Ibatis,全称为MyBatis,是一个支持定制化SQL、存储过程以及高级映射的Java持久层框架。它避免了几乎所有的JDBC代码和手动设置...
在本教程"07_ibatis教程_模糊查询实体对象"中,我们将深入学习如何使用iBatis这个流行的Java持久层框架进行模糊查询操作,尤其是在处理实体对象时。iBatis作为一个轻量级的ORM(Object-Relational Mapping)工具,它...
当需要执行一个模糊查询时,通常会使用`LIKE`关键字配合通配符`%`。例如,以下SQL语句将查询所有姓“张”的学生: ```sql SELECT * FROM T_STUDENT WHERE S_NAME LIKE '张%'; ``` 在iBATIS中,可以使用类似的方法...
开发指南会深入讲解如何初始化iBatis环境,包括设置配置文件、创建SqlMap文件、设计Mapper接口以及如何在Java代码中使用这些组件。此外,还会介绍如何处理结果集、执行批量操作、使用缓存机制等高级特性。 **iBatis...
本篇将详细讲解Ibatis在实现模糊查询、关联查询以及增删改查操作时的关键知识点。 首先,模糊查询是数据库操作中常见的功能,Ibatis通过`<if>`标签或`<where>`标签配合`#{}`占位符来实现。例如,如果你有一个用户...
以上内容详细介绍了 ibatis 中动态查询的基本原理及具体实现方法,包括模糊查询、多条件组合查询以及使用 Map 作为参数的高级用法。这些知识点对于深入理解 ibatis 的动态查询机制非常重要,可以帮助开发者更高效地...
- 在编写SQL时,应避免使用全模糊匹配`LIKE '%text%'`,而应尽可能使用带有前缀或后缀的模糊匹配,如`LIKE 'text%'`,这可以显著提升查询效率。 - 使用`EXISTS`子查询通常比直接关联查询更高效,尤其是在数据量大...
要开始使用 Ibatis,首先需要从官方网站下载最新版本的 ibatis jar 包,以及 log4j 日志框架的 jar 包。然后,在Java项目中添加这些库,配置log4j.properties以开启SQL日志输出。接着,新建主配置文件sqlMapConfig....
在这个例子中,我们将探讨如何使用Ibatis进行一对多的多表查询,以`book`和`user`两个表为例。 首先,我们有两个表:`book`和`user`。`book`表存储书籍信息,包含`oid`(主键)和`name`字段。`user`表存储用户信息,...
在Spring环境中,你可以使用`@Repository`注解标记Mapper接口,然后通过@Autowired注解注入到Service层,这样就可以在Service中直接调用Mapper接口进行查询。 虽然Ibatis3本身并不直接支持JPA,但通过这种方式,...
在分页查询方面,Ibatis允许我们在SQL语句中直接添加LIMIT和OFFSET子句,或者使用自定义的分页插件来实现。 1. **SQL映射分页**:在Ibatis的XML配置文件中,我们可以直接编写包含分页条件的SQL语句。例如,对于...
《iBATIS-SqlMaps-2.pdf》可能是关于iBATIS SQL映射器的详细指南,它会介绍如何编写SQL Map配置文件,这些文件定义了数据库查询和事务处理。SQL Maps是iBATIS的核心部分,它们将数据库查询与Java对象绑定,使得...
例如,假设我们有一个部门表DEPARTMENTS,包含ID(主键)、PARENT_ID(父ID)和NAME(部门名称)字段,可以使用以下SQL语句进行树形查询: ```sql SELECT level, connect_by_root id AS root_id, id, name FROM ...
iBatis 动态查询条件...* 在使用 iBatis 的动态查询条件时,需要注意 SQL 注入问题。 iBatis 的动态查询条件提供了强大的功能,可以根据不同的参数生成不同的 SQL 语句,使得开发者可以更方便地实现复杂的查询逻辑。
在实际使用中,我们可以通过 Ibatis 的 SqlSession 对象来执行查询。例如,调用 `sqlSession.selectList("selectAllBooks")` 将返回一个 `Book` 对象的列表,每个 `Book` 对象的 `users` 列表已经填充了对应的作者...
### ibatis and和or联合查询知识点 #### 一、ibatis简介 ibatis是一个支持普通SQL查询、存储过程以及高级映射的优秀开源数据访问框架。ibatis消除了几乎所有的JDBC对象操作,提供了一个简单的基本API,它通过XML或...
ibatis动态多条件组合查询 实例 说明
本文将围绕“IBATIS开发使用实例”这一主题,深入解析复杂SQL查询的应用,尤其是如何利用SQL进行多表关联、条件筛选以及聚合函数的使用。 ### IBATIS简介 IBATIS,现被称为MyBatis,是一种优秀的持久层框架,它...