ASP防SQL Injection方法

来源:互联网 发布:字符数组 编辑:程序博客网 时间:2024/05/16 18:41

 

原以为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判断返回参数是否数字型。对于第23个例子,返回的参数是字符串型。通常将”’”替换成两个单引号或是其他字符串,这种方法对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讲的比较详细,就不多说了。