什麼是sql注入?
通過構建特殊的輸入作為引數傳入web應用程式,而這些輸入大都是sql語法裡的一些組合;
通過執行sql語句進而執行攻擊者所要的操作,其主要原因是程式沒有細緻地過濾使用者輸入的資料,致使非法資料侵入系統;
例子:
比如在乙個登入介面,要求輸入使用者名稱和密碼,可以這樣輸入實現免帳號登入:
使用者名稱: 『or 1 = 1 –
密 碼:
點登陸,如若沒有做特殊處理,那麼這個非法使用者就很得意的登陸進去了.(當然現在的有些語言的資料庫api已經處理了這些問題)
這是為什麼呢? 下面我們分析一下:
從理論上說,後台認證程式中會有如下的sql語句:
string sql = "select * from user_table where username=' "+username+" ' and password=' "+password+" '";
當輸入了上面的使用者名稱和密碼,上面的sql語句變成:
select * from user_table where username='』or 1 = 1 -- and password='』
分析sql語句:
條件後面username=」or 1=1 使用者名稱等於 」 或1=1 那麼這個條件一定會成功;
然後後面加兩個-,這意味著注釋,它將後面的語句注釋,讓他們不起作用,這樣語句永遠都能正確執行,使用者輕易騙過系統,獲取合法身份。
這個是一般的讀操作,如果操作的為寫操作,後果可想而知;
漏洞分類:
1. 平台層sql注入:
不安全的資料庫配置或資料庫平台的漏洞所致;(許可權)
2. **層sql注入:(比較常見)
程式設計師對輸入未進行細緻地過濾從而執行了非法的資料查詢或者寫操作;
在實際的專案中,mysql做複雜查詢時,往往會存在手拼sql的操作。如果不謹慎就會產生sql注入。
防護建議:
1.對使用者的輸入進行校驗,可以進行強型別校驗,可以通過正規表示式,或限制長度;對單引號和雙"-"進行轉換等。
2.不要使用動態拼裝sql,可以使用引數化的sql
3.不要使用管理員許可權的資料庫連線,為每個應用使用單獨的許可權有限的資料庫連線。
4.不要把機密資訊直接存放,加密或者hash掉密碼和敏感的資訊。
5.應用的異常資訊應該給出盡可能少的提示,最好使用自定義的錯誤資訊對原始錯誤資訊進行包裝。
6.不安全的資料庫;
7.資料層用強型別語言;
如果**的實現方案時弱型別語言,必然存在函式傳入引數難以控制的情況。為了保證型別的有效性和引數的有效性,每一級都要判斷強轉,實現成本較高。所以應該使用強型別語言如golang實現資料層,優先保證型別一致,在型別一致的基礎上保證資料有效。
慕課網:
案例總結:
防止sql注入方法
1 mysql real escape string 轉義 sql 語句中使用的字串中的特殊字元,並考慮到連線的當前字符集 使用方法如下 sql select count as ctr from users where username mysql real escape string userna...
什麼是sql注入,如何防止sql注入漏洞攻擊
使用者根據系統的程式構造非法的引數從而導致程式執行不是程式設計師期望的惡意sql 語句。使用引數化或儲存過程的sql 就可以避免 sql注入。以登入為例,假如登入語句是string sql select count user.id from sys user user where user.user...
Node Mysql 防止 sql 注入方法
引數編碼方法有如下三個 mysql.escape param connection.escape param pool.escape param 例如 var userid 1,name test var query connection.query select from users where ...