2011-09-27 63 views
2

这个问题的标题可能似乎以前被问及和回答,但它对我来说是不同的场景。我使用这个脚本来停止我的ASP网站中的SQL注入。根据我的知识或注射脚本,我尝试了一切。是否仍有可能突破这个代码,或者你觉得这很好。Sql注入脚本

这里是脚本

<% 
Function IsInject(strCheck, boolForm) 
    IsInject = False 
    If Not boolForm And Len(strCheck) > 50 Then IsInject = True 
' Dim sCmdList, arrCmds, i 
    If boolForm Then 
     sCmdList = "declare,varchar,convert,delete,create,is_srvrolemember,ar(,cast(" 
    Else 
     sCmdList = "update,union,select,drop,declare,varchar,convert,delete,create,is_srvrolemember,ar(,cast(,char(" 
    End If 
    arrCmds = Split(sCmdList, ",") 
    For i = 0 To UBound(arrCmds) 
     If Instr(UCase(CStr(strCheck)), UCase(arrCmds(i))) > 0 Then 
      IsInject = True 
      Exit For 
     End If 
    Next 
    Erase arrCmds 
End Function 
Function CleanInject(strClean, boolInt) 
    If boolInt Then CleanInject = CInt(strClean) Else CleanInject = Replace(strClean, "'", "''") 
End Function 

'----------------------------------------------------------- 
'redirect user if specific IP 
'Dim ipaddress, bFBIRedirect, sInjectType 
bFBIRedirect = True 
ipaddress = Request.ServerVariables("REMOTE_ADDR") 
Select Case ipaddress 
    Case "90.120.206.10" 
    Case Else 
     bFBIRedirect = False 
End Select 
If bFBIRedirect Then Response.Redirect "http://www.fbi.gov" 
'----------------------------------------------------------- 

'Dim bIsInject, sHackString 
bIsInject = False 

If Not bInject Then 
' Dim qsItm 
    For Each qsItm In Request.QueryString 
     If IsInject(Request.QueryString(qsItm), False) Then 
      bIsInject = True 
      sHackString = qsItm & "=" & Request.QueryString(qsItm) 
      sHackType = "QueryString" 
      sInjectType = "qs-" & Request.QueryString(qsItm) 
      Exit For 
     End If 
    Next 
End If 
If Not bInject Then 
' Dim frmItm 
' For Each frmItm In Request.Form 
'  If IsInject(Request.Form(frmItm), True) Then 
'   bIsInject = True 
'   sHackString = Request.Form(frmItm) 
'   sHackString = frmItm & "=" & Request.Form(frmItm) 
'   sHackType = "Form" 
'   Exit For 
'  End If 
' Next 
End If 

If bIsInject Then 
    Session("hacktype") = sHackType 
    Session("hackstr") = sHackString 
    Session("thepagefrom") = Request.ServerVariables("PATH_INFO") 
    Session("theip") = Request.ServerVariables("REMOTE_ADDR") 

' Dim arrWhereAt, iWhereAt, sRedirect 

    arrWhereAt = Split(Request.ServerVariables("PATH_INFO"), "/") 
    iWhereAt = UBound(arrWhereAt) 

    sRedirect = "unknownerror.asp?ip=" & Request.ServerVariables("REMOTE_ADDR") & "&err=" & sInjectType & "&pg=" & Request.ServerVariables("PATH_INFO") 
    If iWhereAt = 1 Then sRedirect = "../" & sRedirect 
    If iWhereAt = 2 Then sRedirect = "../../" & sRedirect 
    If iWhereAt = 3 Then sRedirect = "../../../" & sRedirect 

    Response.Redirect sRedirect 
End If 
%> 
+5

**只需使用参数**。 – SLaks

+0

这不会做任何事情来帮助xss攻击。 – asawyer

+1

你好帕雷恩,在这里你只检查了Querystring部分,我可以看到request.form部分被评论,所以这应该在我们发布表单时检查。你也可以检查cookies数据。请让我知道这对你有用。 –

回答

1

使用黑名单删除命令不是一个好主意。你必须确保你覆盖了所有可能的命令,并且仍然有人可能偷偷摸摸过去。如果您从不是攻击的用户那里获取数据,但仍然包含攻击字符串,这也可能会失败。例如“回到苏联时代”。

正如Nikolai所建议的,看看您是否可以找到某种类型的准备好的语句来使用。或者找一个非常好的图书馆来为你正确转义数据。

1

,而这样做,我认为创建SQL查询时,我会用ADO参数对象,第二个最好的事情是做inputfields的类型转换为动态SQL查询,例如作为将字符串转换为SQL字符串(替换任何'用两个'),确保数字是一个数字等。