防止SQL注入的正途

2021-05-01 19:09:44 字數 4214 閱讀 6276

1. 什麼是sql注入

所謂sql注入,就是通過把sql命令插入到web表單遞交或輸入網域名稱或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的sql命令。通過遞交引數構造巧妙的sql語句,從而成功獲取想要的資料。

2. sql注入的種類

從具體而言,sql注入可分為五大類,分別是:數字型注入、字元型注入、搜尋型注入(like)、in型的注入、句語連線型注入。從應用來說,要特別注意ip、搜尋、批量刪除、從資料庫轉到資料庫等地方的sql注入。

3. 如何防止sql注入

3.1 sql注入產生的原因

看下面檢查登陸的sql語句:

sql**

sqlcommand cmd = new sqlcommand("select * from pe_users where username = '"

+ username + "' and userpassword = '" + password + "'", conn);

由於沒有對username和password進行任何驗證,如果username=」 admin』 or 1=1--「

所執行的sql語句就成了:

sql**

select * from pe_users where username=』admin』 or 1=1—『 and userpassword=』』

這就造成了sql注入,條件永遠為真,也就不用密碼也能登陸成功。

3.2主要防禦方式

防禦手段一:引數化查詢

保護級別:★★★★★

描述:使用引數化查詢的好處:可以防止sql注入式攻擊,提高程式執行效率。

例如:sql**

const string strsql = "select * from [pe_users] where username = @username";

parameters parms = new parameters("@username", dbtype.string, username);

中有乙個引數@username, 使用prarmeter物件,通過它把引數新增到command物件上,

這樣就獲得引數化查詢。

14 安全開發手冊

如上述語句,ado.net 會向sql server 傳送下面的sql語句:

sql**

exec sp_executesql n 『select * from [pe_users] where username=@username 『,n

『@username nvarchar(20) 『,@username=n 『name』

sql server 把@username 替換成字串」name」,然後再執行查詢.

假設有下面的輸入:

sql**

『 union select @@version,null,null—

生成的sql語句如下所示:

sql**

exec sp_executesql n 『select * from [pe_users] where username=@username 『,n

『@username nvarchar(20) 『,@username=n 『』』 union select @@version,null,null--』

可以看到ado.net轉義了輸入。

.net**

public sqlparameter add(string parametername, sqldbtype sqldbtype, int size);

dbtye或sqldbtype可以是多種資料型別。

可根據你的資料型別來選擇。

在某些地方,也可似指定引數的長度:int size。這樣也能有效防止資料庫溢位和sql注

入的可能性。

優點:有效地防止了sql注入的產生。

缺點:有些地方不能應用,如 in 。

應用舉例:

動易sitefactory系統中,對於比較固定的地方,我們採用比較安全的儲存過程來

實現。系統中所有sql語句,能用引數化查詢的所有部份都使用了引數化查詢。所有操

作資料庫的地方,都能在命名空間 powereasy.sqlserverdal下找到。

防禦手段二:過濾與轉換

保護級別:★★★★

15 安全開發手冊

描述:對於資料型要強制轉換成數字clng,對於字元型,要通過函式過濾。如:

.net**

private string safesqlliteral(string inputsql)

對於搜尋的地方like 子句,要注意,如果要使用 like 子句,還必須對萬用字元字

符進行轉義:

.net**

s = s.replace("[", "[");

s = s.replace("%", "[%]");

s = s.replace("_", "[_]");

對於in型別,要轉換成規格的數字串或字串。

要盡量少用語句連線形式寫sql語句,要用到的地方要確保連線語句的安全性,或

在白名單內,或限制很短的長度,以防止sql語句構造的危險。

優點:有效地防止了sql注入,實現簡單。

缺點:容易遺漏,對於某些地方還是不能過濾,如 order by + 變數

應用舉例:

動易sitefactory系統中,對於不能使用引數化查詢的部份,我們使用過濾函式處

理,過濾函式在命名空間powereasy.framework.common中的datasecurity類下,如:

filterbadchar函式。這函式主要用於業務邏輯層的過濾,對於資料庫,我們還使用了

強制轉換函式,在命名空間 powereasy.sqlserverdal 下的 dbhelper 類 ,如:

tovalidid 函式等,主要用於資料庫無出錯的處理操作。

防禦手段三:白名單

保護級別:★★★★

描述:對於一些已知的引數範圍,可用白名單的形式處理,能有交防止sql注入和查詢出

錯,如:order by +列名,列名以引數形式傳入時,可制定乙個白名單,先判斷一下參

數是否在白名單內,再進行查詢,否則出錯處理。

優點:安全可靠

缺點:應用範圍小

16 安全開發手冊

3.3 輔助防禦方式

防禦手段一:嚴格過濾

保護級別:★★★☆

描述:對於不能引數化查詢或者無法限制變數型別和範圍的情況,使用過濾的手段來處理。

對於資料庫中讀取的數量要進入查詢語句,在不確定資料是否安全的情況下,要對其進入

過濾。這種sql注入比較隱蔽,所以要特別注意。

優點:能用於不能引數化而又難過濾的地方,如 order by +變數

缺點: 過濾過於嚴格。

應用舉例:

動易sitefactory系統中,對於不能使用引數化查詢的部份,我們使用過濾函式處理,

過濾函式在命名空間powereasy.framework.common中的datasecurity類下,如:

filterbadchar函式。

防禦手段二:限定url傳遞引數的資料型別和範圍

保護級別:★★★

描述:限定url的傳遞引數型別、數量、範圍等來防止通過構造url進行惡意攻擊。參見msdn

雜誌優點:在一定的程式上有效地防止通過url方式的注入。

缺點:容易遺忘正常需要的引數。

應用舉例:

動易sitefactory系統中,需要在config/querystrings.config配置檔案中增加相應的

配置項來控制url的引數傳入,有效控制每個頁面的引數數量和引數型別。

防禦手段三:全域性過濾sql關鍵字過濾

保護級別:★★★

描述:在某些地方進行全域性過濾sql關鍵字過濾,如對標籤的解釋。(可能存在過濾不完全和

限制程式開發的問題)

優點:能用於不能引數化而又難過濾的地方,如 table的連線。

17 安全開發手冊

缺點: 過濾過於嚴格。

應用舉例:

動易sitefactory系統中,對於不能使用引數化查詢的部份,我們使用過濾函式處理,

過濾函式在命名空間powereasy.framework.common中的datasecurity類下,如:

filtersqlkeyword函式,主要應用在標籤引數的傳入的地方。

選crm oa erp scm 進銷存 等軟體,上星燭網! http://www.xingzhu.net.cn

防止SQL注入

1.什麼是sql注入 所謂sql注入,就是通過把sql命令插入到web表單遞交或輸入網域名稱或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的sql命令。通過遞交引數構造巧妙的sql語句,從而成功獲取想要的資料。2.sql注入的種類 從具體而言,sql注入可分為五大類,分別是 數字型注入 字元型注入...

防止SQL注入

最近看到很多人的 都被注入js,被iframe之類的。非常多。本人曾接手過乙個比較大的 被人家入侵了,要我收拾殘局。1.首先我會檢查一下伺服器配置,重新配置一次伺服器安全,可以參考 2.其次,用麥咖啡自定義策略,即使 程式有漏洞,別人也很難在檔案上寫入 了。參考自定義策略,有了這個策略,再爛的程式,...

防止Sql注入

防不勝防 可以肯定的說,過濾不是辦法,而且效率很低 過濾的目的主要是提供反饋資訊,必須前後臺都要做 但是,有很多辦法可以繞過 致命的單引號 能做的事情按重要性大致如下 1。資料庫訪問用預定義會話 preparedstatement 從根本上防止sql截斷 2。後台過濾 為輸入的資訊提供反饋資訊,只要...