木子屋 Dnawo's BLOG

防SQL注入不能滥杀无辜

👤 dnawo 📅 2008-03-22 👁 5369 👍 0 💬 0 🔄 本站原创
我们先来看看新云网站管理系统 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+()][color=Red]*[/color]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+][color=Red]+[/color])"


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

SQL注入漏洞是Web应用程序致命的几大漏洞之一,是应当做好防范,但也不可"宁可错杀一千 而不放走一个"而滥杀无辜,最终造成使用上的不便!

评论(0)

暂无评论。

计算题
评论需审核通过后显示
← 上一篇 使用MSSQL作业定时执行任务 下一篇 → 防止网站数据库被下载