0 0

mybatis模糊查询如何防止sql注入?3

我原本采用like ‘%'${param}'%' 方式 ,但是这种方式会有sql注入的可能,但是换成like #{param} 参数在代码中加入拼接上%。这种就需要在代码判断参数为null的情况。感觉不好。有没有其他方式。期待.....
2011年5月19日 09:44

5个答案 按时间排序 按投票排序

0 0

判断是否为空完全可以交给ibatis来做,使用连接符即可,try this:

<isNotEmpty prepend="and" property="name">
	NAME like '%'||#name#||'%'
</isNotEmpty>


如果你要考虑name走索引的情况那么上面这种语句是不会走索引的,除非你写成:
#name#||'%'

这里多说一句,走索引的情况只限定在'XX%'的like操作中,而'%XX'和'%XX%'无法使用索引的。

2011年5月19日 13:58
0 0

我理解lz的意思,我们项目现在这么做的

<sql id="condition_where">
	<isNotEmpty property="companyName" prepend=" and ">
		t1.company_name like #companyName#
    </isNotEmpty>
</sql>

java代码和你原来的差不多,其实也没什么不好,你要觉得麻烦 把判断null和'%'封装到一个方法里就可以了
			if (!StringUtil.isEmpty(this.companyName)) {
				table.setCompanyName("%" + this.companyName + "%");
			}



还有一种写法,name like '%' || #name# || '%',但是使用的时候,有时候会遇到检索不到数据奇怪的现象,所以项目里没有使用。

2011年5月19日 10:20
0 0

上面的那个回复时拷贝错了,里面不要用${},像duronshi说的

2011年5月19日 10:17
0 0

论坛里有这么一个帖子,楼主可以看下:

http://www.iteye.com/topic/726853?page=2

Oracle
Sql代码
<select id="showOneStudentByName" parameterClass="String" resultMap="studentORM"﹥   
select * from t_stu where s_name like '%'||#name#||'%'    
﹤/select﹥ 
Mysql:
Sql代码
SELECT *   FROM user    
WHERE username like CONCAT('%', #username#, '%')  
SQLServer
Sql代码
SELECT *   FROM user   WHERE username like '%' + #username# +  '%'   
注意:SQL语句不要写成select * from t_stu where s_name like '%$name$%',这样极易受到注入攻击。

2011年5月19日 10:15
0 0

如果参数为null作何操作呢?是查出所有还是放弃查询啊,如果是后者,可以这样搞下:

<if test="param != null">  
    like ‘%'${param}'%'    
</if> 
<if test="param = null">  
    1=2    
</if> 

不知有没有理解错误,:)

2011年5月19日 10:07

相关推荐

Global site tag (gtag.js) - Google Analytics