考慮一個假設的情況下我必須檢索基於用戶標識和代碼示例數據庫中的某些細節如下準備語句會防止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注入。
相同的一般理解是什麼?
對不起,我以前的錯誤答案(刪除)。似乎他們的作品。看看這篇文章:http://stackoverflow.com/questions/1812891/java-escape-string-to-prevent-sql-injection – Heisenbug
通過正確的轉義避免SQL注入是準備語句創建的原因之一。 – Jacob
可能重複[可以通過使用參數避免所有SQL注入攻擊嗎?](http://stackoverflow.com/questions/3736831/can-i-avoid-all-sql-injection-attacks-by-using-parameters ) – Thilo