| 策略 | 做法 | 優點 | 缺點/風險 |
|---|---|---|---|
| 1. 清洗/轉義 | 單引號雙寫 ''、移除危險字元 | 簡單、相容舊碼 | **黑名單永遠不全**;新攻擊向量繞過;二次注入風險 (資料入庫後再用) |
| 2. 拒絕已知惡意 | 黑名單檢測 select, union, --, drop 等 | 攔截明顯攻擊 | 繞過技巧多 (大小寫、編碼、註釋切分);誤殺正常業務 (如「select」作為產品名) |
| 3. 只允許已知合法 (白名單) | 正則/型別驗證:如帳號 `^[a-zA-Z0-9_]{6,20}$` | **最安全**,從源頭切斷 | 業務複雜時難以定義完整白名單 (如人名含撇號 O'Brien) |
-- 攻擊者輸入 (清洗器只刪除單引號)
uni'on sel'ect @@version--
-- 清洗後變成
union select @@version--
**對策**:參數化查詢 (根治);若必須拼接,用**白名單字元集**而非黑名單刪除。
限制 16 字元,清洗器在截斷**前**加單引號,截斷**後**單引號消失:
-- 用戶名 (16字元限制)
aaaaaaaaaaaaaaa' -- 16字元,末尾單引號被清洗器轉義為 ''
-- 密碼
'; shutdown-- -- 開頭單引號閉合上方轉義後的單引號,執行 shutdown
-- 最終 SQL
SELECT * FROM Users WHERE Username='aaaaaaaaaaaaaa'' AND Password=''';shutdown--'
**對策**:**先截斷/驗證長度,再清洗/參數化**;或直接用參數化查詢 (長度由資料庫型別約束)。
-- 攻擊者在註釋後附加
admin'--sp_password
-- 審計日志只記錄
-- 'sp_password' was found in the text of this event. The text has been replaced...
-- 實際注入 SQL 被隱藏
**對策**:審計設定記錄**參數化查詢的參數值** (Extended Events / SQL Audit) 而非僅批次文本;監控異常登入/權限提升行為而非依賴 SQL 文本。
admin'--,系統轉義存入 admin''--。UPDATE Users SET Pass='new' WHERE User=''+从数据库读取的UserName+''。UPDATE Users SET Pass='new' WHERE User='admin'--' → 竄改 admin 密碼。**對策**:**所有進入 SQL 的資料 (含從資料庫讀出的) 皆視為不可信**,統一參數化;或對資料庫欄位加約束/觸發器禁止特殊字元。
**單一防線必失效**。參數化查詢 (代碼層) + 最小權限 (資料庫層) + 輸入驗證 (應用層) + WAF/RASP (網路層) + 審計監控 (運維層) + 定期滲透測試 = 可控風險。**注入漏洞本質是「資料與代碼未分離」,參數化查詢是唯一徹底根治方案,其他皆為輔助緩解。**