原文鏈接: SQL特殊字符轉義
應 該說,您即使沒有處理 HTML 或 JavaScript 的特殊字符,也不會帶來災難性的后果,但是如果不在動態構造 SQL 語句時對變量中特殊字符進行處理,將可能導致程序漏洞、數據盜取、數據破壞等嚴重的安全問題。網絡中有大量講解 SQL 注入的文章,感興趣的讀者可以搜索相關的資料深入研究。
雖然 SQL 注入的后果很嚴重,但是只要對動態構造的 SQL 語句的變量進行特殊字符轉義處理,就可以避免這一問題的發生了。來看一個存在安全漏洞的經典例子:
SELECT COUNT(userId) |
以上 SQL 語句根據返回的結果數判斷用戶提供的登錄信息是否正確,如果 userName 變量不經過特殊字符轉義處理就直接合並到 SQL 語句中,黑客就可以通過將 userName 設置為 “1' or '1'='1”繞過用戶名/密碼的檢查直接進入系統了。
所 以除非必要,一般建議通過 PreparedStatement 參數綁定的方式構造動態 SQL 語句,因為這種方式可以避免 SQL 注入的潛在安全問題。但是往往很難在應用中完全避免通過拼接字符串構造動態 SQL 語句的方式。為了防止他人使用特殊 SQL 字符破壞 SQL 的語句結構或植入惡意操作,必須在變量拼接到 SQL 語句之前對其中的特殊字符進行轉義處理。Spring 並沒有提供相應的工具類,您可以通過 jakarta commons lang 通用類包中(spring/lib/jakarta-commons/commons-lang.jar)的 StringEscapeUtils 完成這一工作:
|
事實上, StringEscapeUtils 不但提供了 SQL 特殊字符轉義處理的功能,還提供了 HTML、XML、JavaScript、Java 特殊字符的轉義和還原的方法。如果您不介意引入 jakarta commons lang 類包,我們更推薦您使用 StringEscapeUtils 工具類完成特殊字符轉義處理的工作。