IBatis解决SQL注入(#与$的区别)
在IBatis中,我们使用SqlMap进行Sql查询时,需要引用参数,在参数引用中可以使用两种占位符#和$.这两种占位符有什么区别呢?
(1):#***#,进行预编译,采用参数化命令方式进行处理,有效防止sql注入,可以进行类型匹配。在模糊查询的时候,使用##
(2):$***$, 不进行数据类型匹配,它只是简单的字符拼接。一般使用于非变量参数,例如数据库对象,select * from $tableName$ 对于不同的表执行统一的查询
1、2中*** 代表属性值,Map中的Key或者model对象中的属性
#与$都能使用的情况下,最好使用#.
#Str# 编译成 'Str'
$Str$ 编译成 Str
例如:
第一种情形:
A: select * from Student where sName like '%'+$Name$+'%'
B:select * from Student where sName like '%'+#Name#+'%'
A、B两种sql语句中,Name都是用户传入的数据,如果用户输入【wei】,则
编译之后,执行的Sql语句:
A:select * from Student where sName like '%'wei'%' --查询不出我们想要的结果
B:select * from Student where sName like '%wei%' --正常执行,返回正确的值。
第二种情形:
C:select top $limit$ * from Student
D:select top #limit# * from Student
C、D两条语句如果需要查询前10条记录,则执行语句为:
C: select top 10 * from Student --由于$$只是简单的拼接,所以正常执行,返回正确的结果
D:select top '10' * from Student ---这个执行显然通不过的。