1. 程式人生 > >java中預處理PrepareStatement為什麼能起到防止SQL注入的作用??!!

java中預處理PrepareStatement為什麼能起到防止SQL注入的作用??!!

       大家都知道,java中JDBC中,有個預處理功能,這個功能一大優勢就是能提高執行速度尤其是多次操作資料庫的情況,再一個優勢就是預防SQL注入,嚴格的說,應該是預防絕大多數的SQL注入。

       用法就是如下邊所示:

String sql="update cz_zj_directpayment dp"+
 "set dp.projectid = ? where dp.payid= ?";
try {
	PreparedStatement pset_f = conn.prepareStatement(sql);
	pset_f.setString(1,inds[j]);
	pset_f.setString(2,id);
	pset_f.executeUpdate(sql_update);
}catch(Exception e){
	//e.printStackTrace();
	logger.error(e.message());
}


       那為什麼它這樣處理就能預防SQL注入提高安全性呢?其實是因為SQL語句在程式執行前已經進行了預編譯,在程式執行時第一次操作資料庫之前,SQL語句已經被資料庫分析,編譯和優化,對應的執行計劃也會快取下來並允許資料庫已引數化的形式進行查詢,當執行時動態地把引數傳給PreprareStatement時,即使引數裡有敏感字元如 or '1=1'也資料庫會作為一個引數一個欄位的屬性值來處理而不會作為一個SQL指令,如此,就起到了SQL注入的作用了!