sql注入漏洞曾經是web應用程式的噩夢,cms、bbs、blog無一不曾受其害。
sql注入的原理
以往在web應用程式訪問資料庫時一般是採取拼接字串的形式,比如登入的時候就是根據使用者名稱和密碼去查詢:
string sql = "select top 1 * from [user] where username = 『」 + username + 「『 and password = 『」 + password + 「『」;
其中username和password兩個變數的值是由使用者輸入的。在username和password都合法的情況下,這自然沒有問題,但是使用者輸入是不可信的,一些惡意使用者只要用一些技巧,就可以繞過使用者名稱、密碼登入。
假設password的值是」1′ or 『1′ = 『1「,username的值隨便取,比如是」abc」,那變數sql的值就是:
"select top 1 * from [user] where username = 『abc』 and password = 『1′ or 『1′ = 『1′」
由於』1′ = 『1′恒為真,因此只要user表中有資料,不管username、password的值是否匹配,這條sql命令準能查出記錄來。就這樣,登入系統就被破解了。
以往的防禦方式
以前對付這種漏洞的方式主要有三種:
字串檢測:限定內容只能由英文、數字等常規字元,如果檢查到使用者輸入有特殊字元,直接拒絕。但缺點是,系統中不可避免地會有些內容包含特殊字元,這時候總不能拒絕入庫。
字串替換:把危險字元替換成其他字元,缺點是危險字元可能有很多,一一枚舉替換相當麻煩,也可能有漏網之魚。
儲存過程:把引數傳到儲存過程進行處理,但並不是所有資料庫都支援儲存過程。如果儲存過程中執行的命令也是通過拼接字串出來的,還是會有漏洞。
引數化查詢
近年來,自從引數化查詢出現後,sql注入漏洞已成明日黃花。
引數化查詢(parameterized query 或 parameterized statement)是訪問資料庫時,在需要填入數值或資料的地方,使用引數 (parameter) 來給值。
在使用引數化查詢的情況下,資料庫伺服器不會將引數的內容視為sql指令的一部份來處理,而是在資料庫完成sql指令的編譯後,才套用引數執行,因此就算引數中含有指令,也不會被資料庫執行。access、sql server、mysql、sqlite等常用資料庫都支援引數化查詢。
SQL注入漏洞
sql注入,就是通過把sql命令插入到web表單遞交或輸入網域名稱或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的sql命令,比如先前的很多影視 洩露vip會員密碼大多就是通過web表單遞交查詢字元暴出的,這類表單特別容易受到sql注入式攻擊 sql注入的發生 當應用程式使用輸入內容來構造動態sq...
sql注入漏洞
什麼是sql注入 通過把sql命令插入到web表單提交或輸入網域名稱或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的sql命令。通俗地講,它是利用現有應用程式,將 惡意 的sql命令注入到後台資料庫引擎執行的能力,它可以通過在web表單中輸入 惡意 sql語句得到乙個存在安全漏洞的 上的資料庫,而...
sql注入漏洞
sql注入漏洞 漏洞簡介 程式設計師在編寫 的時候,沒有對使用者輸入資料的合法性進行判斷,使應用程式存在安全隱患。使用者可以提交一段資料庫查詢 根據程式返回的結果,獲得某些他想得知的資料,這就是所謂的sql injection,即sql注入。一 聯合查詢注入 order by x 判斷列數 unio...