使用jdbc拼接條件查詢語句時如何防止sql注入

2021-10-22 06:21:04 字數 1606 閱讀 3606

使用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 查詢條件的拼接放到儲存過程內,在儲存過程內對查詢條件值進行引數化。...