登陆

asp防注入代码 怎么样防止asp页面被代码注入

城南二哥 2019-09-03 622人围观 ,发现0个评论
现在比较流行的SQL注入工具的工作方式是通过GET和POST来完成具体的注入。我们可以将注入时所用到的一切符号过滤掉。那么我们可以通过简单的判断语句来达到目的。我们先来过滤GET吧。代码如下:dim sql_injdata SQL_inj SQL_GetSQL_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=&#106avascript>alert(’请不要在参数中包含非法字符尝试注入!’);history.back(-1)</Script>" Response.end end if next Next End If 这样我们通过简单的语句我们就把一些注入所必须的语句和符号过滤掉了。非常小巧灵便,只要插到像conn.asp这样类似被调用比较广泛的页面中。同样POST我们也可以通过如下代码过滤,我们可以将两段代码整和到一起。我们来看看代码吧: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=&#106avascript>alert(’请不要在参数中包含非法字符尝试注入! ’);history.back(-1)</Script>" Response.end end if next next end if 网上又流行一个加强版的ASP防注代码。代码如下:<#

'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
请关注微信公众号
微信二维码
Powered By Z-BlogPHP