本主题由 vcert 于 2010-12-30 20:56:00 执行 标题样式 [查看记录]
对于一个网站来说,SQL注入漏洞的危害是巨大的。 由于问题出在代码上,所以最终还是要从程序代码上去解决。不过很多网站的站长对代码并不是很了解,他们只是从网络上下载一套系统来用而已,叫他们自己改代码似乎有点为难了。不过程序的开发人员会不定期地发布一些补丁,站长们可以通过勤打补丁来补上漏洞。 对于具有代码编写能力的人,对每一个从客户端接收来的数据都应该做好过滤才放到SQL语句里去执行。以前的普遍做法是一个一个地过滤有可能出现漏洞的参数,不过现在有人开发了一套SQL通用防注入系统。 其思路就是把提交到页面的所有数据都过滤一遍,其实SQL注入提交的数据都有一个特征,就是数据里会有SQL语句和一些SQL语言的关键字,比如“AND”、“UNION”、“SELECT”等字符串,只要在数据里存在这些字符串,就可以判定为SQL注入行为来处理,而不会把这个数据当成SQL语句去执行了。 以下是作者根据这个思路模仿SQL通用防注入系统编写的代码:<% '--------定义部分------------------ Dim FangZhuPost,FangZhuGet,FangZhuIn,FangZhuInf,FangZhuXh '注释:自定义需要过滤的字串,用“|”分隔,如果读者发现有什么遗漏可以加上去 FangZhuIn = "'|;|and|(|)|exec|insert|select|union|delete|update|count |*|%|chr|mid|master|truncate|char|declare"FangZhuInf = split(FangZhuIn,"|") '注释:把非法字符串用“|”分割出来 '--------POST部分------------------ If Request.Form<>"" Then For Each FangZhuPost In Request.Form '注释:循环取得提交的参数 For FangZhuXh=0 To Ubound(FangZhuInf) '注释:全部转换成大写 If Instr(LCase(Request.Form(FangZhuPost)),FangZhuInf(FangZhuXh))<>0 Then '注释:如果在数据里有非法字符串 Response.Write "<Script Language=JavaScript>alert('请不要在参数中包 含非法字符尝试注入!');</Script>"Response.End End If Next Next End If '----------------------------------'--------GET部分------------------- If Request.QueryString<>"" Then For Each FangZhuGet In Request.QueryString For FangZhuXh=0 To Ubound(FangZhuInf) If Instr(LCase(Request.QueryString(FangZhuGet)),FangZhuInf(FangZhuXh))<>0 Then Response.Write "<Script Language=JavaScript>alert('请不要在参数中包 含非法字符尝试注入!');</Script>"Response.End End If Next Next End If %>把这些代码保存在一个asp文件里,比如fang.asp,并把这个fang.asp文件放在要防护的页面文件的目录下。在要防护的页面开头加入一句<!-- #include file=“fang.asp”→,保存并退出就可以了。再来测试一下,看看是否能防住SQL注入漏洞,在浏览器里面提交http://127.0.0.1 /veryzone/ announce.asp? id=16 and 1=1,就会弹出如图所示的对话框,并且什么也不会显示了。
如果参数里没有非法字符,页面还是可以正常显示的,如图

这样就可以杜绝SQL注入漏洞了,不过这也不是万全之策,因为这个代码是“通杀”的,也就是“宁杀错不放过”的那种,如果用户输入的数据确实要输入那些东西,那也会被当成非法字符串,这种情况到目前还没有更好的办法来解决,只能让用户输入一些其他的字符串来代替。本小节对SQL注入漏洞的防范手法进行了详细的介绍,并模仿防注入漏洞程序编写一段防注入漏洞的代码,从而杜绝SQL注入漏洞的出现了。以目前的情况,还没有人能发现突破这段代码的办法,站长们可以放心地使用这段代码来做防护。
|