SQL注入最簡單也是最多見的例子就是用戶登錄這一模塊,若是用戶對SQL有必定的瞭解,同時系統並無作防止SQL注入處理,用戶能夠在輸入的時候加上’兩個冒號做爲特殊字符,這樣的話會讓計算機認爲他輸入的是SQL語句的關鍵字從而改變你的SQL語句,形成不可估量的損失。
在JDBC中一般會使用PreparedStatement來代替Statement來處理sql語句,如mysql
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語句在數據庫裏執行就是這樣sql
select * from t_user where password='ddd\' or \'1\'=\'1';
它會把惡意的注入語句預處理爲參數數據庫