SQL注入最簡單也是最常見的例子就是用戶登陸這一模塊,如果用戶對SQL有一定的了解,同時系統並沒有做防止SQL注入處理,用戶可以在輸入的時候加上’兩個冒號作為特殊字符,這樣的話會讓計算機認為他輸入的是SQL語句的關鍵字從而改變你的SQL語句,造成不可估量的損失。
在JDBC中通常會使用PreparedStatement來代替Statement來處理sql語句,如
String sql = "select * from t_user where password = ?"; pt = conn.prepareStatement(sql); pt.setString(1, num); rs = pt.executeQuery();
使用PreparedStatement的好處是數據庫會對sql語句進行預編譯,下次執行相同的sql語句時,數據庫端不會再進行預編譯了,而直接用數據庫的緩沖區,提高數據訪問的效率,如果sql語句只執行一次,以后不再復用。
SQL注入 攻 擊 只 對 Statement有效, 對 PreparedStatement 是無效的;
PreparedStatement可以在傳入sql后,執行語句前,給參數賦值,避免了因普通的拼接sql字符串語句所帶來的安全問題,而且准備sql和執行sql是在兩個語句里面完成的,也提高了語句執行的效率 比如單引號會給你加一個轉義,加個斜杠。上面的sql語句在數據庫里執行就是這樣
select * from t_user where password='ddd\' or \'1\'=\'1';
它會把惡意的注入語句預處理為參數