SQL 注入源於使用者輸入未經驗證直接拼接進 SQL 語句。攻擊面涵蓋:QueryString (GET)、Form (POST)、Cookies、HTTP Headers、路徑參數、JSON/XML Body、檔案上傳中繼資料。
Request.QueryString, Request.Form, Request.Cookies, Request.ServerVariables)。conn.asp, global.asa Application_OnStart) 盡早引入,確保所有頁面受保護。<%
' sql_filter.asp
Const SQL_INJ_PATTERNS = "'|;|--|/\*|\*/|@@|char|nchar|varchar|nvarchar|alter|begin|cast|create|cursor|declare|delete|drop|end|exec|execute|fetch|insert|kill|open|select|sys|table|truncate|update|xp_|sp_|waitfor|delay|shutdown|backup|restore|dbcc|grant|revoke|deny|disk|benchmark|sleep|load_file|into|outfile|dumpfile|union|or|and|xor|not|between|like|rlike|regexp|having|group by|order by|limit|offset|information_schema|sysobjects|syscolumns|systables|master|msdb|model|tempdb"
Dim arrPatterns, pattern, col, val, key
arrPatterns = Split(SQL_INJ_PATTERNS, "|")
Sub CheckCollection(colName, coll)
For Each key In coll
val = coll(key)
If IsArray(val) Then
For Each v In val : CheckValue colName, key, v : Next
Else
CheckValue colName, key, val
End If
Next
End Sub
Sub CheckValue(colName, key, val)
If IsNull(val) Or val = "" Then Exit Sub
For Each pattern In arrPatterns
If InStr(1, val, pattern, vbTextCompare) > 0 Then
' 記錄攻擊日誌
LogAttack colName, key, val, pattern, Request.ServerVariables("REMOTE_ADDR"), Request.ServerVariables("HTTP_USER_AGENT")
' 阻斷
Response.Status = "403 Forbidden"
Response.Write "請求包含非法字符,已被攔截。"
Response.End
End If
Next
End Sub
Sub LogAttack(colName, key, val, pattern, ip, ua)
' 寫入資料庫/檔案/系統日誌/發送告警
' 範例: 寫入文字日誌
Dim fso, f, logLine
Set fso = Server.CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile(Server.MapPath("/logs/sql_inj_" & Year(Now) & Right("0"&Month(Now),2) & ".log"), 8, True)
logLine = Now & " | IP=" & ip & " | UA=" & ua & " | Collection=" & colName & " | Key=" & key & " | Value=" & val & " | Matched=" & pattern
f.WriteLine logLine
f.Close
End Sub
' 主程式入口
CheckCollection "QueryString", Request.QueryString
CheckCollection "Form", Request.Form
CheckCollection "Cookies", Request.Cookies
' ServerVariables 視需求啟用 (含大量環境變數)
%>
Command 物件 + Parameter 集合,資料與程式碼徹底分離。Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = conn
cmd.CommandText = "SELECT * FROM Users WHERE Username=?"
cmd.Parameters.Append cmd.CreateParameter("@u", 200, 1, 50, Request.Form("username"))
Set rs = cmd.Executexp_cmdshell。CustomErrors、ASP On Error Resume Next 統一友善提示),避免洩露表結構、連線字串、堆疊追蹤。Classic ASP 已停止主流支援 (Windows Server 2003 結束延伸支援)。建議規劃遷移至 ASP.NET Core / Node.js / Python / Go / Java 等現代框架,原生支援參數化查詢、ORM、依賴注入、中介軟體管線、內建防禦機制,並享有長期安全更新。
關鍵字過濾僅為「安全網」,無法替代參數化查詢這條「防火牆」。通用防護模組可作為舊系統緊急加固手段,但長期必須從架構層面根除 SQL 注入風險。