IBatis.Net使用总结(一)-- IBatis解决SQL注入(#与$的区别)

时间:2023-03-08 22:21:19

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    ---这个执行显然通不过的。