在项目中,运用Ibatis中Like写法,没有研究下,结果SQL语句存在SQL注入漏洞,整理下,下次谨记啊!
sql语句:
select *
from (select 1 from poll
<dynamic prepend=" where ">
<isNotEmpty prepend=" and " property="title">
title like '%$title$%'
</isNotEmpty>
<isNotEmpty property="used">
<isEqual compareValue="true" prepend=" and " property="used">
<![CDATA[status & 2 > 0 and status & 1 <= 0 and status & 8 <= 0 ]]>
</isEqual>
</isNotEmpty>
<isNotEmpty prepend=" and " property="startTimeBegin">
<![CDATA[ gmt_create >= #startTimeBegin# ]]>
</isNotEmpty>
<isNotEmpty prepend=" and " property="startTimeEnd">
<![CDATA[ gmt_create <= #startTimeEnd# ]]>
</isNotEmpty>
</dynamic>
limit 10000
) as t
请关注此写法的:
title like '%$title$%'
存在SQL注入漏洞。
下面是一段单元测试:
PollQuery query = new PollQuery();
query.setCurrentPage(1);
query.setPageSize(50);
query.setTitle("1231%' or '1%' = '1");//很简单的写法:(
List<SnsPollDO> l = pollDAO.findPollList(query);
System.out.println(l.size())
测试结果(打印处的sql语句):
1. select * from poll where title like '%1231%' or '1%' = '1%'
尽管 title 没匹配对,但是or后面那句是恒等的。哎!
看来下面的写法只是简单的转义下:
title like '%$title$%'
如何解决:
在oracle下面改成:title like '%'||#title#||'%',这样肯定是可以的。
但是在mysql中,上述写法是不行,还是有上面的问题的:
select * from poll where title like '%'||?||'%' order by gmt_create desc limit ?, ?
还能查出结果来!哎!
得用:title CONCAT('%',#title#,'%')
select * from poll where title like CONCAT('%',?,'%') order by gmt_create desc limit ?, ?
呵呵,多次测试均没有发现问题!
分享到:
相关推荐
然而,在使用iBatis时,开发人员经常面临着SQL注入问题。SQL注入是一种常见的安全威胁,可能会导致数据泄露、数据篡改、系统崩溃等严重后果。因此,解决SQL注入问题是非常重要的。本文将介绍如何通过iBatis解决SQL...
例如,`select * from PRODUCT where PRD_CAT_ID = #{value}`中的`#{value}`是预编译参数,能有效防止SQL注入。 总结,Ibatis提供了灵活的SQL映射机制,使得开发人员能够更好地控制SQL的执行。同时,通过与Struts和...
需要注意的是,如果直接使用`'%$name$%'`这样的写法,可能会导致SQL注入攻击,因此不建议使用。 ##### 1.3 不同数据库中的LIKE查询 不同的数据库系统对于字符串拼接的操作符有所不同。以下是几种常见数据库系统的...
1. 防止SQL注入攻击:在使用iBATIS进行模糊查询时,需要确保参数的安全性,以防止SQL注入攻击。例如,以下代码是错误的: ```sql SELECT * FROM t_stu WHERE s_name LIKE '%$name$%' ``` 这种代码容易受到SQL注入...
通常情况下,`#`被用来防止SQL注入,它会将变量转化为预编译语句中的占位符。例如: ```sql select * from member where id = #id# ``` 当在Java代码中设置`id`为某个值时,iBATIS会将其转换为如下的预编译SQL: ...
Ibatis提供预编译的PreparedStatement来防止SQL注入,但开发者仍需确保传入的参数值经过了适当的过滤和验证。 总的来说,Ibatis SqlMap 2.3.0对通配符的支持,极大地提升了SQL语句的灵活性,让开发者能够根据业务...
iBatis 动态查询条件...* 在使用 iBatis 的动态查询条件时,需要注意 SQL 注入问题。 iBatis 的动态查询条件提供了强大的功能,可以根据不同的参数生成不同的 SQL 语句,使得开发者可以更方便地实现复杂的查询逻辑。
相反,$name$使用的是SimpleStatement,直接将变量值插入到SQL语句中,这种方式虽然方便,但存在SQL注入的风险。例如,`SELECT * FROM users WHERE id = $id$`,如果$id$的值来自用户输入,未经处理就直接插入,可能...
这里的`#{id}`是Ibatis的参数占位符,它会自动将Java方法中的参数值注入到SQL中。 在查询指定id的单个对象时,Ibatis提供了`<select>`标签,用于定义SQL查询。标签内可以设置id属性,对应Mapper接口中的方法名,...
2. **`$`**:字符串替换,它会将表达式直接插入到SQL语句中,不进行预编译,因此可能存在SQL注入风险。一般不推荐使用,除非你知道你在做什么。例如: ```xml SELECT * FROM user WHERE name like '%$name%' ...
`#{}`是Ibatis的参数占位符,它会将用户对象的属性值注入到SQL语句中。 在Web程序中,我们可以从HttpServletRequest中获取表单数据,并将其设置为查询参数: ```java user.setName(request.getParameter("name"));...
3. **动态SQL的使用**:在"IbatisDemo03"中,你可能会看到如下的例子,例如,根据用户输入的条件来查询数据: ```xml SELECT * FROM Users WHERE 1=1 != null"> AND Name LIKE #{Name} != null"> AND Age...
Ibatis的另一个重要特性是动态SQL,允许在XML映射文件中使用条件语句,使得SQL的生成更加灵活。例如,可以根据条件决定是否添加WHERE子句: ```xml SELECT * FROM users != null"> AND name LIKE #{name} ...
1. **安全性**:IBATIS使用预编译的SQL语句,可以有效防止SQL注入攻击,提高应用程序的安全性。 2. **效率**:预编译的SQL执行速度更快,因为编译只发生在第一次执行时,后续执行直接使用编译好的语句,无需再次编译...
Ibatis,全称为“SQL Map”,是一个开源的Java持久层框架,它允许程序员将SQL语句与Java代码分离,提供了一种灵活的方式来进行数据库...在使用过程中,还需注意SQL注入防护、性能优化等问题,确保代码的安全性和效率。
在Spring环境中,可以使用MyBatis-Spring模块,将SqlSession和Mapper注入到Spring Bean中,简化事务管理和依赖注入。 1. **配置Spring XML**: ```xml <!-- ... --> ``` 2. **在Spring Bean中使用...
Ibatis 是一款轻量级的Java持久层框架,它提供了SQL映射功能,将数据库操作与业务逻辑分离,使得开发者可以更加...在实际项目中,结合Spring框架使用Ibatis,可以实现更高效的事务管理和依赖注入,进一步提升开发体验。
- 在 `Employee.xml` 文件中定义 SQL 查询,并使用动态 SQL 标签 `<isNotEmpty>` 和 `<isNotEqual>` 来控制不同的查询条件。 - 例如: ```xml select * from Employee empName like('%$empName$%') ...
【idatis_mapper例子】是一个关于iBATIS(现更名为MyBatis)的示例集合,...这有助于提高代码的可读性和可维护性,同时降低了SQL注入的风险。理解并熟练运用这些特性,对于提升Java应用程序的数据库交互能力至关重要。
3. 在业务代码中,通过Spring与iBATIS的整合,使用`@Autowired`注入`SqlSessionTemplate`: ```java @Autowired private SqlSessionTemplate sqlSessionTemplate; public List<User> getAllUsers() { return ...