| 网站首页 | 新闻中心 | 系统安全 | 网络安全 | 安全技术 | 下载中心 | 
课件制作网.
收藏本站
设为首页
安全365
另类防注入 v1.0
另类防注入 v1.0
作者:佚名 文章来源:不详 点击数: 更新时间:2007-1-25 11:17:03

单纯的过滤某些危险字符对网站来说还是存在很大的风险的,所以最好的方法还是在发现危险字符后立即停止脚本程序的运行。这个代码比通用防注入要短得多(主要是他还写一些信息到数据库中),而且在调用后会把传递过来的参数进行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】
文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
     
     
     
    sql通用防注入程序
    另类的注射攻击----cook
    SQL通用防注入3.1β版的
    防注入程序带来的攻击及
    通用防注入原来形同虚设
    发布SQL通用防注入3.1β
    一段防注入的通用脚本
    另类系统体验 用SkyOS作
    文件权限和注册表权限的
    加密玩另类:微软Word插

    Copyright © 2006-2008 www.anquan365.com 安全365
    建议使用1024*768分辨率及第三方浏览器对本站进行浏览