SQL 注入年損失達數十億美元。傳統參數化查詢屬「程式碼層面防禦」,本文探討「語言層面根治」:利用 SQL 公理系統的任意性,構建攻擊者無法預測的等價語法表示。
SQL 採用中綴表示法,可無損轉換為任意等價表示法:
(select * T (and (= f1 'val1') (= f2 val2)))select(*,T,and(=(f1,'val1'),=(f2,val2)))T.where(f1.=('val1')).and(f2.=val2).select(*)攻擊者注入 ' OR 1=1 -- 在新語法下皆為語法錯誤,因攻擊者無法構造符合任意選擇語法規則的惡意輸入。
關鍵字本質是任意 Token,可建立隨機映射表:
{"select":"iph0ohKi", "*":"ieZoh4xa", "from":"aeZi5uja", "where":"OoJ4aX4n", "=":"eeQu2Zad", ...}
操作數同理加入隨機前後綴:T → @phai1Oa6@T@。注入後的 SQL 含原生 OR、= 等 Token,在隨機語法中均為非法。
模板 Token 數量固定 (如 12 個)。注入後 Token 數量必變 (如變 20 個)。驗證 Token 計數、AST 結構深度、節點類型分佈等不變量,偵測注入行為。攻擊者必須同時滿足所有未知不變量,幾乎不可能。
真正的解決方案在於:SQL 語句的任意性 + 所有不變量自動驗證。無需程式設計師額外小心,自動完成防禦。攻擊者面對未知的任意語法規則集,屬難解問題,從根本上封鎖注入向量。
延伸閱讀: 此思路同樣適用於 HTML 模板、Shell 腳本等所有基於模板的語言注入防禦。