单纯的过滤某些危险字符对网站来说还是存在很大的风险的,所以最好的方法还是在发现危险字符后立即停止脚本程序的运行。这个代码比通用防注入要短得多(主要是他还写一些信息到数据库中),而且在调用后会把传递过来的参数进行sql注入检查,同时把它存入到同名变量中。大大提高程序编写的方便性和安全性。哈哈。 明白我的想法的兄弟就顶下
<% '##################################################################################################### ' 另类防注入 v1.0 '作者:haicao[E.S.T] http://haicao.126.com '调用函数 前面一个参数是给变量加前缀(即为前缀+控件名的形式)若无前缀则为"" '第二个参数为sql防注入检查函数名。未使用时为空 '调用该函数后可以通过控件名称或前缀+控件名称的方式直接访问啦!就省得用request语句去一个一个获取参数了。 '把上面两个函数写到一个文件里,然后在须要取参数的地方include进来。调用一下函数就ok了! '这样调用后,GET/POST方式传递过来的参数将放在控件同名变量(或加某个前缀)中,大大提高编程效率和安全性! '##################################################################################################### getSingleVar "","checkstr" %>
<% function getSingleVar(avar,sqlchkFunc) '代码功能:取get或post方式提交的数据存在同名的变量中 '最好用来取控件名称不重复的。 'avar表示取得的变量名称为avar+控件名称的形式,如果不加前缀则参数应该为"" 'sqlchkFunc为取值时使用sql防注入检查
if Request.ServerVariables("REQUEST_METHOD")="GET" then getFlag=true 'get方式提交 else getFlag=false 'post方式提交 end if if getFlag then For Each item In Request.QueryString if sqlchkFunc<>"" then execute(avar&item&"="&sqlchkFunc&"("&""""&replace(Request.QueryString(item),vbcrlf,"<br>")&""""&")") else execute(avar&item&"="&""""&replace(Request.QueryString(item),vbcrlf,"<br>")&"""") end if Next else For Each item In Request.Form if sqlchkFunc<>"" then execute(avar&item&"="&sqlchkFunc&"("&""""&replace(Request.Form(item),vbcrlf,"<br>")&""""&")") else execute(avar&item&"="&""""&replace(Request.Form(item),vbcrlf,"<br>")&"""") end if next end if end function
Function checkstr(str) dsql="'|;|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare" 'sql危险字符 可以不断扩充 d_sql=split(dsql,"|") for each d in d_sql if instr(Lcase(str),d) then writeScript "对不起参数中含有不合法字符!",-1 response.end end if next checkstr=str end function
function writeScript(byval info,byval target) 'info为将要用脚本显示的信息,target为转向目标页 response.Write("<script language='javascript'>"&vbcrlf) response.Write("alert('"&info&"');"&vbcrlf) if target=-1 then response.Write("history.go(-1);"&vbcrlf) else response.Write("location.href='"&target&"';"&vbcrlf) end if response.Write("</script>"&vbcrlf) end function %>
把上面两个函数写到一个文件里,然后在须要取参数的地方include进来。调用一下函数就ok了!
#########
如果要过滤所有的post get传递来的数据,必须每个变量都要调用一次函数,这个倒不如直接在conn.asp里include一个文件,然后对所有的变量挨个检查那样方便。
接触asp脚本这么长时间,我还不知道execute(avar&item&"="&""""&replace(Request.Form(item),vbcrlf,"<br>")&"""") 中execute这个是干吗用的,函数?方法?
'定义变量,并且定义需要过滤的字符 dim sql_injdata SQL_injdata = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare" SQL_inj = split(SQL_Injdata,"|")
'当get方式时对变量一个个检查,如果存在非法字符,可以转向其他页,也可以警告,也可以后退,还可以停止程序的执行(response.end) 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=JavaScript>alert('SQL通用防注入系统提示↓nn请不要在参数中包含非法字符尝试注入!');history.back(-1)</Script>" Response.end end if next Next End If
当post方式时对变量一个个检查,如果存在非法字符,可以转向其他页,也可以警告,也可以后退,还可以停止程序的执行(response.end) 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=JavaScript>alert('SQL通用防注入系统提示↓nn请不要在参数中包含非法字符尝试注入!nnHTTP://www.okhtm.com ');history.back(-1)</Script>" Response.end end if next next end if
然后在conn.asp或者是任何一个你想防止注入的地方引用这个页。 【转自世纪安全网 http://www.21safe.com】
|