SQL特殊字符轉義


原文鏈接: SQL特殊字符轉義

應 該說,您即使沒有處理 HTML 或 JavaScript 的特殊字符,也不會帶來災難性的后果,但是如果不在動態構造 SQL 語句時對變量中特殊字符進行處理,將可能導致程序漏洞、數據盜取、數據破壞等嚴重的安全問題。網絡中有大量講解 SQL 注入的文章,感興趣的讀者可以搜索相關的資料深入研究。

雖然 SQL 注入的后果很嚴重,但是只要對動態構造的 SQL 語句的變量進行特殊字符轉義處理,就可以避免這一問題的發生了。來看一個存在安全漏洞的經典例子:

SELECT COUNT(userId) 
FROM t_user
WHERE userName='"+userName+"' AND password ='"+password+"';

 

以上 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 完成這一工作:


清單 4. SqlEscapeExample


package com.baobaotao.escape;
import org.apache.commons.lang.StringEscapeUtils;
public class SqlEscapeExample {
public static void main(String[] args) {
String userName = "1' or '1'='1";
String password = "123456";
userName = StringEscapeUtils.escapeSql(userName);
password = StringEscapeUtils.escapeSql(password);
String sql = "SELECT COUNT(userId) FROM t_user WHERE userName='"
+ userName + "' AND password ='" + password + "'";
System.out.println(sql);
}
}

 

事實上, StringEscapeUtils 不但提供了 SQL 特殊字符轉義處理的功能,還提供了 HTML、XML、JavaScript、Java 特殊字符的轉義和還原的方法。如果您不介意引入 jakarta commons lang 類包,我們更推薦您使用 StringEscapeUtils 工具類完成特殊字符轉義處理的工作。

 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM