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