原以为SQL注入已经是过时的话题,最近工作上发现许多网站还是存在着这方面的漏洞。不少网管对“‘”和关键字过滤,对于网上流行的一些SQL注入工具还是毫无作用。看来老话题还得重谈,SQL注入还需要更多的关注。
通常判断网站是否存在SQL注入漏洞,可以通过下面3种方法。
1.数字型 "select * from table_name where field_name=1"
1 and 1=1 显示正常
1 and 1=2 数据找不到或报错。
2.字符型 "select * from table_name where field_name='a'"
a' and 1=1-- 显示正常
a' and 1=0-- 找不到或报错。
3.搜索型 "select * from table_name where field_name like'%a%'"
a%' and 1=1-- 显示正常
a%' and 1=2-- 找不到或报错。
从上面看出如果在编程的过程中对返回的值不做检查就加以使用,必然导致SQL注入问题。第1个例子,参数是数字型,调用函数IsNumberic判断返回参数是否数字型。对于第2,3个例子,返回的参数是字符串型。通常将”’”替换成两个单引号或是其他字符串,这种方法对char()函数就无能为力。因此,在过滤单引号的同时还需将一些查询的关键字过滤掉。
下面给出一段防范SQL注入的代码,仅供参考。
uti_si.asp
<%
Dim PagePost,PageGet,SIStr,TempStr,FilterStr
'自定义需要过滤的字串,用 "|" 分隔
FilterStr = "'|;|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare"
SIStr = split(FilterStr,"|")
'POST部分
If Request.Form<>"" Then
For Each PagePost In Request.Form
For TempStr=0 To Ubound(SIStr)
If Instr(LCase(Request.Form(PagePost)),SIStr(TempStr))<>0 Then
Response.Write "<Script Language=JavaScript>alert('请不要在参数中包含非法字符尝试注入!');history.back(-1)</Script>"
Response.End
End If
Next
Next
End If
'GET部分
If Request.QueryString<>"" Then
For Each PageGet In Request.QueryString
For TempStr=0 To Ubound(SIStr)
If Instr(LCase(Request.QueryString(PageGet)),SIStr(TempStr))<>0 Then
Response.Write "<Script Language=JavaScript>alert('请不要在参数中包含非法字符尝试注入!');history.back(-1)</Script>"
Response.End
End If
Next
Next
End If
%>
将unti_si.asp放到网站中include到需要过滤的网页中。
另外网页查询Sql Server的权限应当加以控制,如果是sysadmin或是db_owner的权限,攻击者一旦发现了SQL注入漏洞后果就比较严重了。http://dev.csdn.net/article/61/61969.shtm,这篇文章对Sql Server讲的比较详细,就不多说了。