JAVA 如何解決SQL注入?

2021-08-30 17:59:11 字數 1630 閱讀 2033

面試中經常問到,sql注入是什麼?又怎麼防止sql注入?為了不再尷尬得只回答出使用preparedstatement,我們還是有必要了解一下其他的方式。

說簡單點,就是部分使用者在表單中輸入sql語句的片段,對沒有輸入檢驗的**可能帶來毀滅性的打擊,輕則繞過登入,重則刪庫、洩露資料。

假設某個**沒有輸入引數檢驗,並且後台的sql語句為

string sql = "select * from user where username='" + username + "' and password='" + password + "'";
那麼如果我在表單中輸入的使用者名為

string username="' or 1=1 --";
並且任意輸入乙個密碼後,會發生什麼呢?組合後的sql語句為

string aftersql="select * from user where username='' or 1=1 -- and password='123'";
where中的子句username='' or 1=1永遠為真,是因為使用了--,將後面的密碼判斷給注釋了。這樣子我可以繞過登入,去做一些危害**的事情,比如刪庫。即使用下面的注入

string deletedb="select * from user where username='';drop table user -- and password='123'";
可見,如果乙個**不對輸入的引數進行檢驗的話,很可能會威脅到**自身的安全。

sql注入只會發生在sql編譯的過程中,那麼避免非法sql語句被編譯,就是我們要做的事情。

在jdbc中,使用statement的子類preparedstatement,這也是我們最先想到的方法

事先將sql語句傳入preparedstatement中,等會要傳入的引數使用?代替,那麼該sql語句會進行預編譯,之後將前台獲取的引數通過set方式傳入編譯後的sql語句中,那麼此時被注入的sql語句無法得到編譯,從而避免了sql注入的問題。而且使用preparedstatement在一定程度上有助於資料庫執行效能的提公升。

preparedstatement preparedstatement = connection.preparestatement(sql);

preparedstatement.setstring(1, username);

preparedstatement.setstring(2, password);

mybatis中盡量使用#{}而不是${},下面給出乙個典型的查詢寫法

select * from t_user where us_id=#

#{}就像是jdbc中的?,mybatis通過使用#{}的方式,代表該語句在執行之前會經過預編譯的過程,後來傳入的引數通過佔位符的方式填入到已經編譯完的語句中。但使用${}的引數會直接參與編譯,不能避免sql注入。如果需求中非要使用到${}的話,只能手動過濾了。

手動過濾引數

宣告乙個危險引數陣列danger,將前台傳入的引數用「 」分隔後,產生的引數陣列與danger有交集時,終止該sql的執行,並反饋前台,提示禁止輸入非法字元。

c 如何解決SQL注入的問題

參考 2 在注入的時候替換成 後面在進行新增值 乾貨!直接貼 using system using system.collections.generic using system.linq using system.text using system.threading.tasks using my...

如何解決sql注入安全漏洞問題

sql注入從表面意思來說就是利用你的sql的不規範性,獲取破壞你的資料庫資訊,一般都會使用第三方工具全面掃瞄尋找注入口。那麼如何防護呢,主要從四個層面來談談 一 前端對特殊字元進行過濾 前端頁面是和使用者交流的視窗,但是魚龍混雜的使用者中你也不知道誰不懷好意,所以要做到對所有需要使用者手動輸入的地方...

java如何防止sql注入

採用預編譯語句集,它內建了處理sql注入的能力,只要使用它的setstring方法傳值即可 string sql select from users where username and password preparedstatement prestate conn.preparestatemen...