java編程——sql如何優雅的注入

前言

SQL注入,對這個說法一點都不陌生,但是具體什麼叫sql注入,什麼情況會發生sql注入,又該如何預防它的發生,一直都不是很清楚。

是什麼

所謂SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。

具體來說,它是利用現有應用程序,將(惡意的)SQL命令注入到後臺數據庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。

為什麼會發生

最簡單的理解SQL注入漏洞形成的原因主要就是,網站代碼存在漏洞,或者程序沒有細緻地過濾用戶輸入的數據造成的。

SQL注入攻擊指的是通過構建特殊的輸入作為參數傳入Web應用程序,而這些輸入大都是SQL語法裡的一些組合,通過執行SQL語句進而執行攻擊者所要的操作,許多網站程序在編寫時,沒有對用戶輸入的合法性進行判斷或者程序中本身的變量處理不當,使應用程序存在安全隱患。這樣,用戶在使用應用程序時,通過特殊輸入內容來構造動態sql語句來訪問數據庫,而這些輸入大都是SQL語法裡的一些組合,這就相當於提交了一段sql語句的代碼,通過執行SQL語句進而執行攻擊者所要的操作,於是sql注入就發生了。

例證

比如程序的代碼是利用的拼接字符串

string sql = "Insert into category(name) values ('" + caName + "')";

插入語句是根據用戶輸入的字符串來執行的,比如用戶在下圖的textbox中輸入“軍事新聞”,那麼整個插入語句就是:string sql = "Insert into category(name) values ('軍事新聞')";

這樣,軍事新聞就插到了數據庫category表中。

這是正常用戶的使用方法,也是程序員期待的使用方法。

java編程——sql如何優雅的注入

但是,偏偏有用戶不按正常套路出牌,他非要在textbox框中輸入“軍事新聞')delete from category where id = 1--”,如上圖所示。

那麼這時候插入語句就變成了:

string sql = "Insert into category(name) values ('軍事新聞')delete from category where id = 1--')";

這樣的語句就相當與兩條完整的sql語句,用戶在軍事新聞後邊輸入了“')”,正好使前一部分語句(如下圖標紅語句),變成了一個完整的插入語句:

string sql = "Insert into category(name) values ('軍事新聞')delete from category where id = 1--')";

而後一部分語句(如下圖標紅語句),又是一條語句:

string sql = "Insert into category(name) values ('軍事新聞')delete from category where id = 1--')";

還是一條刪除語句,刪除了id=1的記錄。

有人也許會問“--”是什麼呢?在數據庫中"--"表示註釋,所以"--"後邊的內容都被註釋掉了,剩下的內容正好是一條插入,一條刪除,兩條sql語句。

這樣就發生了sql注入,或者說惡意sql語句的攻擊。

如何預防

歸納一下,主要有以下幾點:

1.永遠不要信任用戶的輸入。對用戶的輸入進行校驗,可以通過正則表達式,或限制長度;對單引號和

雙"-"進行轉換等。

2.永遠不要使用動態拼裝sql,可以使用參數化的sql或者直接使用存儲過程進行數據查詢存取。

3.永遠不要使用管理員權限的數據庫連接,為每個應用使用單獨的權限有限的數據庫連接。

4.不要把機密信息直接存放,加密或者hash掉密碼和敏感的信息。

5.應用的異常信息應該給出儘可能少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝

6.sql注入的檢測方法一般採取輔助軟件或網站平臺來檢測,軟件一般採用sql注入檢測工具jsky,網站平臺就有億思網站安全平臺檢測工具。MDCSOFT SCAN等。採用MDCSOFT-IPS可以有效的防禦SQL注入,XSS攻擊等。

java編程——sql如何優雅的注入

結語

而我們上述的例證正是由於使用了第二點預防所提到的動態拼接sql語句,而導致的sql注入。理解的很片面,若有錯誤,望各位大咖指點。


分享到:


相關文章: