'ASP防注入之解决方案'特殊页面处理'因为有些页通过流式传递(比如含有文件上传的表单)'如果单一使用穷举Form对象的操作就会出错'所以要把这些页面过滤出来,同时在页面中使用sql("检测的字串")才行
'将本页用include方法放在头部以让所有页都可以调用,比如include在conn.asp里'如果有流式上传的页面请把该页加到表page中,以防form冲突
Dim N_no,N_noarray,req_Qs,req_F,N_i,N_dbstr,Conn,N_rs,N_userIP,N_thispageN_userip = Request.ServerVariables("REMOTE_ADDR")N_thispage = LCase(Request.ServerVariables("URL"))
N_no = "'|;|and|exec|insert|select|delete|update|count|*|#|chr|mid|master|truncate|char|declare" '可以自己修改怀疑是注入操作的字串N_noarray = split(LCase(N_no),"|")
Call DBopen()Call N_check_Qs()Call N_checkPage()Call DBCLose()
'检测当前页是否是特殊页是就调用 N_check_form()sub N_checkPage()
set N_rs = server.CreateObject("ADODB.RecordSet")N_rs.open "select * from page where spcpage like '#"&N_thispage&"#'",conn,1,1if (N_rs.eof AND N_rs.Bof) thenCall N_check_form()end ifN_rs.Close()set N_rs = nothing
end sub
'检测给定字串sub N_sql(agsql)'这里是不记录数据库,如果要改请自己修改N_check "CUS",req_Qs,"OTHER"end sub
'检测Request.Formsub N_check_form()If Request.Form<>"" ThenFor Each req_F In Request.FormN_check req_F,Request.Form(req_F),"POST"Nextend ifend sub
'检测Request.QueryStringsub N_check_Qs()If Request.QueryString<>"" ThenFor Each req_Qs In Request.QueryStringN_check req_Qs,Request.QueryString(req_Qs),"GET"Nextend ifend sub
'检测sub N_check(ag,agsql,sqltype)For N_i=0 To Ubound(N_noarray)If Instr(LCase(agsql),N_noarray(N_i))<>0 Thencall N_regsql(ag,agsql,sqltype)Response.Write "MO"end ifNextend sub
'记录并停止输出'ag 名称'agsql 内容'sqltype 类型sub N_regsql(ag,agsql,sqltype)if(sqltype<>"OTHER") thenConn.Execute("insert into SqlIn(Sqlin_IP,SqlIn_Web,SqlIn_FS,SqlIn_CS,SqlIn_SJ) values('"&N_userip&"','"&N_thispage&"','"&sqltype&"','"&ag&"','"&agsql&"')")end ifResponse.Write "<Script Language=&#106avascript>alert('请不要在参数中包含非法字符尝试注入!');</Script>"Response.Write "<span style='font-size:12px'>非法操作!系统做了如下记录↓<br>"Response.Write "操作IP:"&N_userip&"<br>"Response.Write "操作时间:"&Now&"<br>"Response.Write "操作页面:"&N_thispage&"<br>"Response.Write "提交方式:"&sqltype&"<br>"Response.Write "提交参数:"&ag&"<br>"Response.Write "提交数据:"&agsql&"</span>"
Response.endend sub
Sub DBopen()N_dbstr="DBQ="+server.mappath("Sql.mdb")+";DefaultDir=;DRIVER={Microsoft Access Driver (*.mdb)};"Set Conn=Server.CreateObject("ADODB.CONNECTION")Conn.open N_dbstrend SUB
Sub DBCLose()Conn.closeSet Conn = NothingEnd sub#>代码说明里面写的很明白将本页用include方法放在头部以让所有页都可以调用,比如include在conn.asp里,如果有流式上传的页面请把该页加到表page中,以防form冲突。代码比前面的严谨的多,而且多了IP记录等功能。
SQL注入漏洞可谓是“千里之堤,溃于蚁穴”,这种漏洞在网上极为普遍,通常是由于程序员对注入不了解,或者程序过滤不严格,或者某个参数忘记检查导致。本人自己也吃过苦头。在这里,我给大家一个函数,代替ASP中的Request函数,可以对一切的SQL注入Say NO,函数如下:
Function SafeRequest(ParaName,ParaType)'--- 传入参数 ---'ParaName:参数名称-字符型'ParaType:参数类型-数字型(1表示以上参数是数字,0表示以上参数为字符)Dim ParavalueParavalue=Request(ParaName)If ParaType=1 thenIf not isNumeric(Paravalue) thenResponse.write "参数" & ParaName & "必须为数字型!"Response.endEnd ifElseParavalue=replace(Paravalue,"'","''")End ifSafeRequest=ParavalueEnd functionsql注入被那些菜鸟级别的所谓黑客高手玩出了滋味,,发现现在大部分黑客入侵都是基于sql注入实现的 ,哎,,谁让这个入门容易呢,好了,,不说废话了,,现在我开始说如果编写通用的sql防注入程序 一般的http请求不外乎 get 和 post,所以只要我们在文件中过滤所有post或者get请求中的参数信息中 非法字符即可,所以我们实现http 请求信息过滤就可以判断是是否受到sql注入攻击。 iis传递给asp.dll的get 请求是是以字符串的形式,,当 传递给request.querystring数据后,, asp解析器会分析request.querystring的信息,,然后根据"&",分出各个数组内的数据 所以get的拦截如下 首先我们定义请求中不能包含如下字符 '|and|exec|insert|select|delete|update|count|*|#|chr|mid|master|truncate|char|declare 各个字符用"|"隔开,,然后我们判断的得到的request.querystring 具体代码如下 dim sql_injdata sql_injdata = "'|and|exec|insert|select|delete|update|count|*|#|chr|mid|master|truncate|char|declare" sql_inj = split(sql_injdata,"|")
if request.querystring<>"" then for each sql_get in request.querystring for sql_data=0 to ubound(sql_inj) if instr(request.querystring(sql_get),sql_inj(sql_data))>0 then response.write "<script language=****>alert('天下电影联盟sql通用防注入系统提示↓nn请不要在参数中包含非法字符尝试注入!');history.back(-1)</script>" response.end end if next next end if 这样我们就实现了get请求的注入的拦截,但是我们还要过滤post请求,所以我们还得继续考虑request.form,这个也是以数组形式存在的,,我们只需要再进一次循环判断即可。代码如下 if request.form<>"" then for each sql_post in request.form for sql_data=0 to ubound(sql_inj) if instr(request.form(sql_post),sql_inj(sql_data))>0 then response.write "<script language=****>alert('天下电影联盟sql通用防注入系统提示↓nn请不要在参数中包含非法字符尝试注入!nnhttp://www.521movie.com/ ');histor ... 115;cript>" response.end end if next next end if 好了大功告成,,我们已经实现了get和post请求的信息拦截,,你只需要在conn.asp之类的打开数据库文件之前引用这个页面即可。放心的继续开发你的程序,,不用再考虑是否还会受到sql注入攻击。难道不是么?
AAKY,7II56U65