轉!! PreparedStatement是如何防止SQL注入的


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';

它會把惡意的注入語句預處理為參數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM