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。後台過濾 為輸入的資訊提供反饋資訊,只要...