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