防SQL注入不能滥杀无辜

 我们先来看看新云网站管理系统 v3.1.0.1231的防SQL注入函数:

程序代码 程序代码
Public Function CheckInfuse(ByVal str, ByVal strLen)
    Dim strUnsafe, arrUnsafe
    Dim i
    
    If Trim(str) = "" Then
        CheckInfuse = ""
        Exit Function
    End If
    str = Left(str, strLen)
    
    On Error Resume Next
    strUnsafe = "'|^|;|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare"
    If Trim(str) <> "" Then
        If Len(str) > strLen Then
            Response.Write "<Script Language=JavaScript>alert('安全系统提示↓/n/n您提交的字符数超过了限制!');history.back(-1)</Script>"
            CheckInfuse = ""
            Response.End
        End If
        arrUnsafe = Split(strUnsafe, "|")
        For i = 0 To UBound(arrUnsafe)
            If InStr(1, str, arrUnsafe(i), 1) > 0 Then
                Response.Write "<Script Language=JavaScript>alert('安全系统提示↓/n/n请不要在参数中包含非法字符!');history.back(-1)</Script>"
                CheckInfuse = ""
                Response.End
            End If
        Next
    End If
    CheckInfuse = Trim(str)
    Exit Function
    If Err.Number <> 0 Then
        Err.Clear
        Response.Write "<Script Language=JavaScript>alert('安全系统提示↓/n/n请不要在参数中包含非法字符!');history.back(-1)</Script>"
        CheckInfuse = ""
        Response.End
    End If
End Function

使用这段函数只要参数中包含"insert|select|delete|update"等字符就被认为是在注入,那么偏偏有时候我要搜索的就是"update"呢?对不起,不行!显然这已造成了使用上的不便。

再来看看FoosunCMS V4.0 Sp5 For ASP的防SQL注入函数:

程序代码 程序代码
Function NoSqlHack(FS_inputStr)
    Dim f_NoSqlHack_AllStr,f_NoSqlHack_Str,f_NoSqlHack_i,Str_InputStr
    Str_InputStr=FS_inputStr
    '目前用最严的过滤方式
    f_NoSqlHack_AllStr="dbcc|alter|drop|* |and|exec|or|insert|select|delete|update|count|master|truncate|declare|char|mid(|chr|set |where|xp_cmdshell"
    f_NoSqlHack_Str = Split(f_NoSqlHack_AllStr,"|")

    For f_NoSqlHack_i=LBound(f_NoSqlHack_Str) To Ubound(f_NoSqlHack_Str)
        If Instr(LCase(Str_InputStr),f_NoSqlHack_Str(f_NoSqlHack_i))<>0 Then
            If f_NoSqlHack_Str(f_NoSqlHack_i)="'" Then f_NoSqlHack_Str(f_NoSqlHack_i)=" /' "
            Response.Write "<html><title>警告</title><body bgcolor=""EEEEEE"" leftmargin=""60"" topmargin=""30""><font style=""font-size:16px;font-weight:bolder;color:blue;""><li>您提交的数据有恶意字符</li></font><font style=""font-size:14px;font-weight:bolder;color:red;""><br><li>您的数据已经被记录!</li><br><li>您的IP:"&Request.ServerVariables("Remote_Addr")&"</li><br><li>操作日期:"&Now&"</li></font></body></html><!--Powered by Foosun Inc.,AddTime:"&now&"-->"
            Response.End
        End if
    Next
    NoSqlHack = Replace(Replace(Str_InputStr,"'","''"),"%27","''")
End Function

和新云一样也是存在过滤过严的问题!

下边我们再看看PowerEasy® SiteWeaver™ CMS 6.5 Build 0128的防SQL注入函数:

程序代码 程序代码
Sub StopInjection(Values)
    Dim FoundInjection
    regEx.Pattern = "'|;|#|([/s/b+()]+(select|update|insert|delete|declare|@|exec|dbcc|alter|drop|create|backup|if|else|end|and|or|add|set|open|close|use|begin|retun|as|go|exists)[/s/b+]*)"
    Dim sItem, sValue
    For Each sItem In Values
        sValue = Values(sItem)
        If regEx.Test(sValue) Then
            FoundInjection = True
            Response.Write "很抱歉,由于您提交的内容中含有危险的SQL注入代码,致使本次操作无效! "
            Response.Write "<br>字段名:" & sItem
            Response.Write "<br>字段值:" & sValue
            Response.Write "<br>关键字:"
            Set Matches = regEx.Execute(sValue)
            For Each Match In Matches
                Response.Write Match.value & " "
            Next
            Response.Write "<br><br>如果您是正常提交仍出现上面的提示,请联系站长修改Config.asp文件的第7行,暂时禁用掉防SQL注入功能,操作完成后再打开。"
            
        End If
    Next
    If FoundInjection = True Then
        Response.End
    End If
End Sub

看来动易程序员已经考虑到了滥杀的可能性,所以只有当"select|update|insert|delete"等字符前含有空格可才会被认为是在注入!不过个人认为注入时空格恐怕都应该在这些字符之后更多些吧?regEx.Pattern的值改为:

程序代码 程序代码
regEx.Pattern = "'|;|#|([/s/b+()] *select|update|insert|delete|declare|@|exec|dbcc|alter|drop|create|backup|if|else|end|and|or|add|set|open|close|use|begin|retun|as|go|exists)[/s/b+] +)"


是不是更恰当些呢?^_^

SQL注入漏洞是Web应用程序致命的几大漏洞之一,是应当做好防范,但也不可"宁可错杀一千 而不放走一个"而滥杀无辜,最终造成使用上的不便!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值