SQL注入漏洞解决方法
本文只指針編碼層次的SQL注入漏洞解決方法,例子代碼是以java為主。
1,參數(shù)化的預(yù)編譯查詢語句
不安全例子
String query = "SELECT account_balance FROM user_data WHERE user_name = "
+ request.getParameter("customerName");
try {
Statement statement = connection.createStatement( … );
ResultSet results = statement.executeQuery( query );
}
防止通過參數(shù)傳不安全值,必須使用參數(shù)化的預(yù)編譯查詢語句
String custname = request.getParameter("customerName"); // This should REALLY be validated too
// perform input validation to detect attacks
String query = "SELECT account_balance FROM user_data WHERE user_name = ? ";
PreparedStatement pstmt = connection.prepareStatement( query );
pstmt.setString( 1, custname);
ResultSet results = pstmt.executeQuery( );
2,輸入?yún)?shù)驗證白名單
不建議將SQL語句關(guān)鍵部分作參數(shù)傳遞,如表名、字段名或排序符(ASC、DESC)等。建議設(shè)計通過標(biāo)識來判斷,如以下例子
String tableName;
switch(PARAM):
case "Value1": tableName = "fooTable";
break;
case "Value2": tableName = "barTable";
break;
...
default : throw new InputValidationException("unexpected value provided for table name");
用戶輸入可以轉(zhuǎn)換為非String,如日期,數(shù)字,布爾值,枚舉類型等等,然后再附加到查詢中,或者用于選擇附加到查詢的值,這樣可以確保它是安全的。
public String someMethod(boolean sortOrder) {
String SQLquery = "some SQL ... order by Salary " + (sortOrder ? "ASC" : "DESC");
...
3,轉(zhuǎn)義所有用戶輸入
這種技術(shù)只能作為最后的手段,當(dāng)上述手段都不可行時。因為這種方法與其他防御相比是虛弱的,輸入驗證可能是一個更好的選擇。我們不能保證在所有情況下都會阻止所有SQL注入。只推薦在舊系統(tǒng)中使用輸入?yún)?shù)驗證成本高時使轉(zhuǎn)義所有用戶輸入,新寫系統(tǒng)或重構(gòu)系統(tǒng)當(dāng)然使參數(shù)化的預(yù)編譯查詢語句和輸入?yún)?shù)驗證。每種數(shù)據(jù)庫的轉(zhuǎn)義大不相同,具體參考ESAPI are available here on OWASP。例子是ORACLE下轉(zhuǎn)義所有用戶輸入
Codec ORACLE_CODEC = new OracleCodec();
String query = "SELECT user_id FROM user_data WHERE user_name = '" +
ESAPI.encoder().encodeForSQL( ORACLE_CODEC, req.getParameter("userID")) + "' and user_password = '"
+ ESAPI.encoder().encodeForSQL( ORACLE_CODEC, req.getParameter("pwd")) +"'";
4,其它方法
設(shè)置程序使用的數(shù)據(jù)庫帳號最少權(quán)限,或者使用不的帳號賦于它們對應(yīng)的權(quán)限。
參與資料
SQL Injection Prevention Cheat Sheet
總結(jié)
以上是生活随笔為你收集整理的SQL注入漏洞解决方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 葡萄城报表介绍:多数据源报表
- 下一篇: 操作系统中避免死锁的银行家算法【表面C+