在不能選擇參數化查詢的情況下,如何防止 SQL 注入?
我正在使用 ESRI 的 arcpy 模組,我需要指定一個
WHERE
子句作為此函式的參數。由於結果最終將用於從數據庫中檢索數據,因此WHERE
子句的文本有時會直接傳遞給數據庫,但遺憾的是,ESRI 沒有為我提供任何參數化查詢的選項。由於我想防止潛在的 SQL 注入,我需要找到一些替代方法來保護我的數據庫。想到的一個選項是限制輸入並在此函式呼叫之前拋出錯誤,如果它不符合。就我而言,呼叫者只需要 ASCII 字母數字字元。列中不允許使用其他類型的字元用於過濾。將使用者限制為僅使用字母數字字元是否足以防止 SQL 注入,尤其是因為必須將文本引用為字元串?
如果您真的可以限制為字母數字字元,那麼是的,那很好,如果您限制為 ANSI 字母數字字元。在 Unicode 中,因為每個字元都超過一個字節,所以許多字母數字字元的表示實際上是不安全的,並且可能導致注入。
您將需要在伺服器端清理數據並確保編碼是安全的。我建議您查看 OWASP 的 ESAPI 庫,了解它們是如何做到的(參見本頁第三部分)。
通常的方法是確保使用者輸入的字元串中不允許使用來自 SQL 的各種關鍵字。但是有很多情況需要檢查。
可以通過以下方式避免引用:
SELECT CHAR(97) + CHAR(100) + CHAR(109) + CHAR(105) + CHAR(110)
返回admin和以這種方式將字元添加在一起的技術可以在 WHERE 中使用,而無需使用引號。
所以基本上 - 你必須建構你的查詢,並且在將它發送到數據庫之前,通過將它與 SQL 關鍵字匹配來驗證它沒有做任何你不希望它做的事情,但是有很多事情去檢查。因此,請確保諸如 select、exec(所有變體)、convert、union、drop、truncate 以及任何大小寫組合中的幾乎任何危險關鍵字等內容都不在使用者字元串中。此外,不應允許任何可以轉換的字節流(0x 數字)以避免許多字典檢查,特別是如果從字典中忘記了 exec 命令。
如果它是一個 Web 應用程序,請確保檢查此伺服器端而不是客戶端。
如果您不能使用參數,這幾乎是我能給出的最佳建議。