針對既有 ASP 程式存在 SQL 注入漏洞,綜合網路各種防禦手法,改良出 SafeRequest 函數替代原生 Request 物件,集中過濾高風險關鍵字。
Function SafeRequest(ParaName)
Dim ParaValue
ParaValue = Request(ParaName)
If IsNumeric(ParaValue) = True Then
SafeRequest = ParaValue
Exit Function
ElseIf InStr(LCase(ParaValue), "select ") > 0 Or _
InStr(LCase(ParaValue), "insert ") > 0 Or _
InStr(LCase(ParaValue), "delete from") > 0 Or _
InStr(LCase(ParaValue), "count(") > 0 Or _
InStr(LCase(ParaValue), "drop table") > 0 Or _
InStr(LCase(ParaValue), "update ") > 0 Or _
InStr(LCase(ParaValue), "truncate ") > 0 Or _
InStr(LCase(ParaValue), "asc(") > 0 Or _
InStr(LCase(ParaValue), "mid(") > 0 Or _
InStr(LCase(ParaValue), "char(") > 0 Or _
InStr(LCase(ParaValue), "xp_cmdshell") > 0 Or _
InStr(LCase(ParaValue), "exec master") > 0 Or _
InStr(LCase(ParaValue), "net localgroup administrators") > 0 Or _
InStr(LCase(ParaValue), " and ") > 0 Or _
InStr(LCase(ParaValue), "net user") > 0 Or _
InStr(LCase(ParaValue), " or ") > 0 Then
Response.Write ""
Response.End
Else
SafeRequest = ParaValue
End If
End Function
全專案將 Request("param") 替換為 SafeRequest("param") 即可。
IsNumeric 判斷為數字則不檢查。注意:黑名單法無法防禦所有變形攻擊(如編碼繞過、寬字節注入),建議搭配參數化查詢、最小權限帳號、WAF 等多層防護。