网站的sql注入已经成为非常普遍的漏洞,令无数站长头疼不已。
究其原因,主要是对客户端传送参数的随意性导致的,因此只要有效保证了传入参数,就可以避免注入攻击。
在这里我简单的讲传入参数分为两种:数字型和字符串型。
字符串型:目前的解决办法来看,就是过滤单引号了。过滤单引号之后的字串要进行注入,至少我还没想到什么有效的办法。
数字型:过滤引号是不够的!还必须确定是数字型!因为sql可以执行转换为16进制数值的查询语句,所以只要将注入语句转换为16进制字符串附加在参数当中,就可以逃避对引号的判断。
因此综合上面的分析,只要判断了参数类型,然后针对字符串参数加以过滤就可以简单的避免sql注入了。
但是在写程序过程中,尤其是vbscript这样的弱类型语言,难免有疏漏的时候,所以我写了下面这个函数,如果所有的传入参数都经过这个函数进入,作为程序得一个小的"防火墙"就可以很有效的避免上面所说的攻击了。
'=========================================================
' Function getRequest(byval str,byval stype) str为传入的参数名称,stype为限定的类型(int、str),requestType为查询的类型(form、querystring、servervariables)。
' get the request str with type
'=========================================================
public Function getRequest(byval str,byval stype,byval requestType)
dim requestStr
if requestType="form" then
requestStr = request.form(str)
else if requestType = "querystring" then
requestStr = request.querystring(str)
else if requestType = "servervariables" then
requestStr = request.ServerVariables(str)
else
response.write("错误的查询类型")
response.end
Exit Function
end if
If Isnull(requestStr) Then
getRequest = ""
Exit Function
End If
if stype="int" then
if IsNumeric(requestStr) then
getRequest = requestStr
Exit Function
else
response.write("参数类型错误")
response.end
Exit Function
end if
end if
requestStr = Replace(requestStr,Chr(0),"")
requestStr = Replace(requestStr,"'","''")
getRequest = requestStr
End Function
注:在下水平有限,不当之处请各位指教。
(出处:http://www.sheup.com)