如何防範SQL注入

2021-09-30 08:40:34 字數 2592 閱讀 6348

sql注入攻擊的總體思路:

發現sql注入位置;

判斷伺服器型別和後台資料庫型別;

確定可執**況

對於有些攻擊者而言,一般會採取sql注入法。下面我也談一下自己關於sql注入法的感悟。

注入法:

從理論上說,認證網頁中會有型如:

select * from admin where username='***' and password='yyy' 的語句,若在正式執行此句之前,如果沒有進行必要的字元過濾,則很容易實施sql注入。

如在使用者名稱文字框內輸入:abc』 or 1=1-- 在密碼框內輸入:123 則sql語句變成:

select * from admin where username='abc』 or 1=1 and password='123』 不管使用者輸入任何使用者名稱與密碼,此語句永遠都能正確執行,使用者輕易騙過系統,獲取合法身份。

猜解法:

基本思路是:猜解所有資料庫名稱,猜出庫中的每張表名,分析可能是存放使用者名稱與密碼的表名,猜出表中的每個欄位名,猜出表中的每條記錄內容。

還有一種方式可以獲得你的資料庫名和每張表的名。

就是通過在形如:http://www. .cn/news?id=10'的方式來通過報錯獲得你的資料庫名和表名!

對於jsp而言我們一般採取一下策略來應對:

1、preparedstatement

如果你已經是稍有水平開發者,你就應該始終以preparedstatement代替statement.

以下是幾點原因

1、**的可讀性和可維護性.

2、preparedstatement盡最大可能提高效能.

3、最重要的一點是極大地提高了安全性.

*從技術上講,用preparedstatement 不能拼sql

,即便拼了sql進入,db的sql執行引擎只會把拼的串當做值,不會當做sql執行 ,還有就是如果前台的輸入用的是flex 的password元件,該元件會自動限制不能輸入空格.如果不能輸入空格,則在很大程式上限制了惡意sql注入的可能性

到目前為止,有一些人(包括本人)連基本的惡義sql語法都不知道.

string sql = "select * from tb_name where name= '" varname "' and passwd='" varpasswd "'";

如果我們把[' or '1' = '1]作為name傳入進來.密碼隨意,看看會成為什麼? 網管網bitscn.com

select * from tb_name = 'or '1' = '1' and passwd = '隨意' ;

因為'1'='1'肯定成立,所以可以任何通過驗證.更有甚者:

把['; drop table tb_name; ]作為varpasswd傳入進來,則:

select * from tb_name = '隨意' and passwd = ''; drop table tb_name; 有些資料庫是不會讓你成功的,但也有很多資料庫就可以使這些語句得到執行.

而如果你使用預編譯語句.你傳入的任何內容就不會和原來的語句發生任何匹配的關係.(前提是資料庫本身支援預編譯,但上前可能沒有什麼服務端資料庫不支援編譯了,只有少數的桌面資料庫,就是直接檔案訪問的那些只要全使用預編譯語句,你就用不著對傳入的資料做任何過慮.而如果使用普通的 statement,有可能要對drop,; 等做費盡心機的判斷和過慮.

2、正規表示式

2.1、檢測sql meta-characters的正規表示式 /(/')|(/')|(/-/-)|(/#)|(#)/ix

2.2、修正檢測sql meta-characters的正規表示式 /((/=)|(=))[^/n]*((/')|(/')|(/-/-) 54ne.com

|(/;)|(:))/i

2.3、典型的 sql 注入攻擊的正規表示式 //w*((/')|(/'))((/o)|o|(/o))((/r)|r|(/ 中國網管聯盟www.bitscn.com

r))/ix

2.4、檢測sql注入,union查詢關鍵字的正規表示式 /((/')|(/'))union/ix(/')|(/') - 單

引號和它的hex等值  union - union關鍵字。

2.5、檢測ms sql server sql注入攻擊的正規表示式 /exec(/s|/ ) (s|x)p/w /ix

3、字串過濾

public static string filtercontent(string content)

return content;

}4、不安全字元遮蔽

本部分採用js來遮蔽,起的作用很小,這樣用遮蔽關鍵字的方法雖然有一定作用,但是在實際應用中這些 sql的關鍵字也可能成為真正的查詢關鍵字,到那是被你遮蔽了那使用者不是不能正常的使用了。 只要在**規範上下點功夫就可以了。

凡涉及到執行的sql中有變數時,用jdbc(或者其他資料持久層)提供的如:preparedstatement就可以 ,切記不要用拼接字串的方法就可以了.

功能介紹:檢查是否含有"'","//","/"

引數說明:要檢查的字串

返回值:0:是 1:不是

函式名是

function check(a) }

} return 1;

如何防範SQL注入 SQL注入測試

從測試來進行測試sql注入。首先,看看sql注入攻擊能分為以下三種型別 inband 資料經由sql 注入的通道取出,這是最直接的一種攻擊,通過sql注入獲取的資訊直接反映到應用程式的web頁面上 out of band 資料通過不同於sql 注入的方法獲得 譬如通過郵件等 推理 這種攻擊時說並沒有...

如何防範SQL注入 SQL注入測試

從測試來進行測試sql注入。首先,看看sql注入攻擊能分為以下三種型別 inband 資料經由sql 注入的通道取出,這是最直接的一種攻擊,通過sql注入獲取的資訊直接反映到應用程式的web頁面上 out of band 資料通過不同於sql 注入的方法獲得 譬如通過郵件等 推理 這種攻擊時說並沒有...

如何防範SQL注入 SQL注入測試

從測試來進行測試sql注入。首先,看看sql注入攻擊能分為以下三種型別 inband 資料經由sql 注入的通道取出,這是最直接的一種攻擊,通過sql注入獲取的資訊直接反映到應用程式的web頁面上 out of band 資料通過不同於sql 注入的方法獲得 譬如通過郵件等 推理 這種攻擊時說並沒有...