使用jdbc拼接條件查詢語句時如何防止sql注入
最近公司的專案在上線時需要進行安全掃瞄,但是有幾個專案中含有部分老**,運算元據庫時使用的是jdbc,並且竟然好多都是拼接的sql語句,真是令人抓狂。
在具體改造時,必須使用preparedstatement來防止sql注入,普通sql語句比較容易改造,本重點**在拼接查詢條件的時候如何方式sql注入,具體思路請參考下面的示例**。
1 資料庫示例資料
2 使用statement(不防止sql注入)
2.1 示例**
@test
public void statementtest() catch (sqlexception e) finally }
2.2 控制台結果
select * from user where 1 = 1 and username = 『tom』 and *** = 『1』 and address = 『』 or 『1』=『1』
10 tom 2014-07-10 1 beijing
16 tom 2018-07-31 1 shanghai
22 tom 2019-04-16 2 shanghai
24 tom 2019-06-22 1 guangzhou
25 tom 2019-01-22 2 guangzhou
28 tom 2018-07-31 1 shenzhen
2.3 小結
經過上面的示例**我們可以發現,單純拼接sql語句是非常危險的,特別容易被sql注入,但是如果使用preparestatement的話,像這種條件查詢我們預先並不能確定到底有多少個?(佔位符),也就不能使用按照?(佔位符)索引去設定引數了,那怎麼辦呢?
別擔心,此時我們使用乙個小小的技巧,具體參考下面的示例**
3 使用preparestatement(可以防止sql注入)
3.1 示例**
@test
public void preparestatementtest()
if (*** != null)
if (address != null)
system.out.println(sql);
try
res = stat.executequery();
printres(res);
} catch (sqlexception e) finally }
3.2 控制台結果
select * from user where 1 = 1 and username = ? and address = ?
3.3 小結
可以看出,使用preparestatement是可以防止sql注入的。
但進行類似條件拼接這種操作時,可以先把引數放入乙個集合中,然後遍歷集合,同時利用setobject(index,obj)這個方法就可以動態的獲取引數的索引了,而且不用關心引數是何種型別。
4 問題總結
如今在進行專案開發時已經很少使用原生的jdbc了,大多數都用功能強大的框架去完成,他們幫我們簡化了很多操作,如獲取資料庫連線、封裝結果集、sql預編譯(可以防止sql注入)
如果實在避免不了使用的話一定要使用可以需編譯的preparestatement物件,避免被sql注入帶來的風險。
jdbc拼接條件查詢語句時如何防止sql注入
可以使用 preparedstatement preparedstatement繼承statement,效能上要優於statement。原因 preparedstatement採用預編譯機制將sql語句中的主幹和引數分別傳給資料庫伺服器,從而使資料庫分辨出哪些是sql語句的主幹,哪些是引數,從而有效...
多條件查詢時,拼接原生sql語句的方法
完善 author 張齊 說明 根據前台用輸入的查詢條件,得到乙個原生查詢語句 param searchcondition 引數陣列 return sqlquery 返回的原生sql語句 public sqlquery getsqlquery string searchcondition if se...
where條件拼接查詢
最近在做乙個動態拼接where條件的查詢,大概想到了以下幾種方法 1 內拼接查詢條件,sql也是寫在 內的。2 內拼接查詢條件,sql寫在儲存過程內,將 where條件作為乙個字串傳入儲存過程。這種需要在 內過濾sql注入的問題 3 查詢條件的拼接放到儲存過程內,在儲存過程內對查詢條件值進行引數化。...