下面,我从程序方面介绍一下SQL注入的防御方法,首先看这三句最简单SQL语句 1.SQL="select * from Users where UserID=" & Request("ID") 2.SQL="select * from Users where UserID='" & Request("ID") & "'" 3.SQL="select * from Users where UserName like '%" & Request("Name") & "%'"
对于字符型变量,传入的参数都是做为常量,比如你传1 and 1=1进去,SQL语句就是UserID='1 and 1=1',在单引号界定范围里面的值永远都只是一个常量,要打破这个范围,唯一的字符就是界定的字符:单引号。所以,字符型变量只要过滤了'号就完全安全了,至于如何过滤,最好是把一个单引号替换成两个单引号,因为SQL语句里面规定,'常量'这样表示的常量里面,常量里面如果要有单引号,可以用两个单引号代替。这样,既可以保持用户输入的原貌,又可以保证程序的安全。
下面是两个函数,大家可以Copy过去直接调用就行了。
'--------------------------------------------------------------- ' NB联盟防注入函数 ReqNum / ReqStr '--------------------------------------------------------------- Function ReqNum ( StrName ) ReqNum = Request ( StrName ) if Not isNumeric ( ReqNum ) then Response.Write "参数必须为数字型!" Response.End End if End Function
Function ReqStr ( StrName ) ReqStr = Replace ( Request(StrName), "'", "''" ) End Function
以上面三句SQL语句,说明一下调用方法:
1.SQL="select * from Users where UserID=" & ReqNum("ID") 2.SQL="select * from Users where UserID='" & ReqStr("ID") & "'" 3.SQL="select * from Users where UserName like '%" & ReqStr("Name") & "%'"