防止SQL注入

2021-05-17 20:00:08 字數 4108 閱讀 8815

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物件上,

這樣就獲得引數化查詢。

1414 安全開發手冊

如上述語句,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下找到。

防禦手段二:過濾與轉換

保護級別:★★★★

1515 安全開發手冊

描述:對於資料型要強制轉換成數字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 +列名,列名以引數形式傳入時,可制定乙個白名單,先判斷一下參

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

優點:安全可靠

缺點:應用範圍小

1616 安全開發手冊

3.3 輔助防禦方式

防禦手段一:嚴格過濾

保護級別:★★★☆

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

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

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

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

缺點: 過濾過於嚴格。

應用舉例:

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

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

filterbadchar函式。

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

保護級別:★★★

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

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

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

應用舉例:

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

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

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

保護級別:★★★

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

限制程式開發的問題)

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

1717 安全開發手冊

缺點: 過濾過於嚴格。

應用舉例:

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

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

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

防止SQL注入

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

防止Sql注入

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

防止SQL注入

net防sql注入方法 1,利用sqlcommand傳引數的方法 stringstrsql select from user where user id id sqlcommand cmd newsqlcommand cmd.commandtext strsql cmd.parameters.add...