概述ASP.NET安全
如果做一個項目,涉及到一個網站的開發,站點需要大量的數據輸入和填寫各種的用戶資料,一個兄弟對數據輸入沒有太上心,對輸入的數據沒有進行必要的處理和過濾。結果系統上線可怕的事情發生了,第一天站點出現了各種各樣的錯誤,站點被數據撐的亂七八糟,HTML的數據把站點搞的面目全非,第二天站點管理員密碼被修改,第三天…。日子還在繼續…我可憐的兄弟開始焦頭爛額一。
一.次攻擊的例子
一般的web系統,包括ASP.NET開發的web系統都涉及到數據輸入的功能,數據輸入是一個在普通不過的操作,但對于一個黑客或者蓄意要破壞你系統的人來說,小小的數據輸入的文本框里面蘊藏著很大的攻擊系統的機會。
首先也從一個現象談起,大家在編寫ASP.NET系統的時候一般都要涉及到登陸,很多人是按照下面的方法來編寫登陸代碼的,我們結合sql語句來介紹。(這里涉及的sql語句以sql SERVER為準)。
- dataaccessb Db=new DataAccessB();
- if(db.select("select*from admin where name='"+Uername.Text+"'
and pwd='"+Password.Text+"'").Rows.Count<=0)- {
- response.write("<script>alert('用戶名或密碼錯誤')</script>");
- session["admin"]="0";
- }
- else
- {
- session["admin"]="1";
- server.transfer("manager.aspx");
- }
假如是上述的代碼,如果侵入者使用一點點非常的技巧就可以輕松的得到一個導致數據庫錯誤判斷的sql語句,從而使系統把輸入任何數據的人放入系統管理頁面.
下面來看看到底做了哪些手腳?
攻擊者只需要在用戶名和密碼處輸入or 1=1,就可以使得系統得到一個錯誤的SQL語句,系統得到的錯誤語句如下:
"select*from admin where name='' OR 1=1 and pwd='' OR 1=1''通過這樣恒成立的SQL語句就可以得到全部的數據,按照代碼的判斷,系統將認為有符合要求的數據,從而進入系統管理界面。
通過諸如此類的方法侵入者可以在任何一個要輸入信息的窗體輸入一些非法的數據從而進入需要密碼才可以進入的系統,另外還可以通過在比如查詢頁,通過輸入特定的字符得到一些機密的信息,等等。
通過上述的介紹,不難看出數據的輸入是存在隱患的,如果設計的時候不考慮清楚,將來可是后患的.那如何來安全它們呢?
二.最易上手的三招
作為數據輸入篇關鍵是解決數據輸入安全性的問題,那么我們如何通過必要的手段來把數據輸入這個環節做的盡可能的ASP.NET安全些呢?
1. 對數據庫角色的管理
我們在使用ASP.NET連接數據庫的時候,只要你不是使用指定角色,比如aspnet這個角色訪問sql SERVER 2000,或者信任連接。那么都需要在數據庫連接字串里面加上一個帳戶。一般這個帳戶都是SQL SERVER系統內開的一個帳戶。在實際的部署過程中很多人都習慣性的把這個帳戶的權限設置成系統管理員,或者對好幾個庫都可以操作的角色。這樣帶來的危險是一旦此帳號使用的系統被別人注入成功的話,別人將可以對數據庫的一個庫或者多個庫發起攻擊,造成難以挽回的損失。
建議一個系統一個帳戶和權限。權限按照夠用就行,越低越安全的準則。
2. 給系統加數據驗證控件
結合上面的例子,其實只要開發的時候給我們的輸入文本框簡單的加一個驗證控件就可以解決問題了。
另外還有一個辦法就是對于綜合性的數據殊輸入我們可以通過string..replace()的方式來過濾掉一些諸如“‘= LIKE等等的敏感字符,使的輸入的非法數據無法正常的被數據庫所執行。
3.代碼的正確寫法
養成一個良好的數據庫訪問代碼的正確寫法,將幫助我們減少被數據輸入攻擊的機會。
利用參數的方式來訪問操作數據庫就是一個比較好的方式。結合前文提到的那個攻擊例子,我們完全可以改造一些代碼,使的ASP.NET安全性成倍的增加。
- sqldataadapter Auery_Ad = new SqlDataAdapter
("SELECT * FROM admin WHERE name = @user AND pwd=@pass", the_connection);- sqlparameter ParamUser = Auery_Ad.SelectCommand.Parameters.Add (>>
- "@user",sqldb.varchar,20);
- paramuser.value= uername.Text;
- sqlparameter ParamPwd = Auery_Ad.SelectCommand.Parameters.Add (>>
- "@ pass ",SqlDb.VarChar,20);
- parampwd.value= Password.Text;
最后就是要注意一下跨站攻擊,跨站攻擊目前在.net FRAMWORK1.1中也有所完善,一般在傳遞一些含有腳本字符的數據的時候,系統都會提示“發現潛在的危險腳本”來防止跨站的攻擊。但這個方式也會妨礙我們平時的一些正常的操作和效果。
在web.config文件里面有如下的配置信息:
- <pages validateRequest="false" />
設置為true的話,系統將禁止html格式代碼數據。
三.小結:
相信通過上述的規范編寫和防范,一般常規的注入式攻擊和數據輸入安全是可以保證的了,每一個技術都有自己的特點,學會利用這里技術特點和特性就可以幫助我們解決很多的實際問題。ASP.NET安全代碼的編寫,是可以找到很多的現成技術和資料的。
【編輯推薦】