許多開發者嘗試過濾單引號 ' 來防禦 SQL 注入,但這僅能阻擋初級攻擊。熟悉 SQL 的攻擊者可利用內建函數繞過此類過濾。
WHERE xtype='U' 可改寫為 WHERE xtype=CHAR(85)(U 的 ASCII 碼為 85)。WHERE name='用戶' 可改寫為 WHERE name=NCHAR(29992)+NCHAR(25143)。同理,SQL Server 使用 CHAR()、NCHAR();Access 使用 CHR()。
selecT、unIoN 等變體。name 屬性,資料庫欄位名常與之對應。+ 解析為空格,%2B 為 +,%25 為 %。善用 URLEncode 繞過過濾。SQL 注入根源在於「資料與代碼未分離」。最有效的防禦是使用參數化查詢(Prepared Statements)。若環境限制,可參考以下 ASP 安全封裝函數替代 Request:
Function SafeRequest(ParaName, ParaType)
' ParaType: 1=數值型, 0=字串型
Dim ParaValue
ParaValue = Request(ParaName)
If ParaType = 1 Then
If Not IsNumeric(ParaValue) Then
Response.Write "參數 " & ParaName & " 必須為數字型!"
Response.End
End If
Else
' 字串型:單引號轉義(雙單引號)
ParaValue = Replace(ParaValue, "'", "''")
End If
SafeRequest = ParaValue
End Function
原理: 數值型驗證 IsNumeric;字串型將單引號轉義為兩個單引號(SQL 標準轉義方式),使輸入無法閉合 SQL 字串常數。
無論您是安全研究員、開發者或技術愛好者,理解攻擊原理才能構建堅固防線。安全與開發,本是相輔相成。