2011-08-19 61 views
5

考慮一個假設的情況下我必須檢索基於用戶標識和代碼示例數據庫中的某些細節如下準備語句會防止SQL注入攻擊嗎?

private String getpassword(String username) { 

PreparedStatement statement = null; 
ResultSet resultSet = null; 
Connection conn = null; 

final String selectQuery = "SELECT password FROM " + "users WHERE username=?"; 
try { 
    conn = dataSource.getConnection(); 
    statement = conn.prepareStatement(selectQuery); 
    statement.setString(1, username); 
    resultSet = statement.executeQuery(); 
    if (resultSet.next()) { 
     } 

} catch (SQLException e) { 
// log it 
} 
//return 
} 

這個用戶名被賦予實際上是從客戶端到來,用戶可以篡改數據(如果他想)。因此,PreparedStatements將阻止接受引號並僅將過濾的SQL形式發送到數據庫。

例如:我可以提供username ='或1 = 1,它將是一個有效的SQL語句。但是,如果驅動程序從用戶輸入中轉義引號,那麼他們會阻止sql注入。

相同的一般理解是什麼?

+0

對不起,我以前的錯誤答案(刪除)。似乎他們的作品。看看這篇文章:http://stackoverflow.com/questions/1812891/java-escape-string-to-prevent-sql-injection – Heisenbug

+0

通過正確的轉義避免SQL注入是準備語句創建的原因之一。 – Jacob

+0

可能重複[可以通過使用參數避免所有SQL注入攻擊嗎?](http://stackoverflow.com/questions/3736831/can-i-avoid-all-sql-injection-attacks-by-using-parameters ) – Thilo

回答

0

用戶名和查詢將作爲兩個單獨的東西發送到數據庫,數據庫引擎將負責將兩者重新組合在一起。該查詢在讀取參數時已由引擎編譯,因此兩者不會被視爲同一語句的一部分。

3

使用參數和預準備語句可以防止SQL注入攻擊,即傳遞「'或1 = 1」不會導致意外的數據返回。但是,如果在任何階段將數據顯示回用戶,則需要確保生成的HTML不會受到從數據庫返回的用戶輸入的影響

例如,如果您的網頁顯示:

Hello, ${username} 

如果用戶名是

<script>alert('I could have been more malicious')</script> 

可能導致XSS和CSRF的攻擊。

N.B.

Hello, ${fn:escapeXml(username)} 

會更安全(JSP代碼)。

一個很好的參考是: