如何創(chuàng)建安全的Web應(yīng)用程序_.Net教程
推薦:解讀ASP.NET安全架構(gòu)在開發(fā)Web程序中,我們可以選擇用自己的方法來(lái)實(shí)現(xiàn)安全的策略,或者可以購(gòu)買第三方的安全代碼和產(chǎn)品,不管怎么樣,都是要很大的花費(fèi)的,幸好在.NET Framework中已經(jīng)內(nèi)置了安全的解決方案。 ASP.NET和 .NET Framework 聯(lián)合IIS為Web應(yīng)用程序安全提供了一個(gè)基礎(chǔ)
把一個(gè)問(wèn)題說(shuō)清楚,是要有前提的,也要大家有一些通過(guò)的詞匯,就像大家談OO,就知道談的面向?qū)ο�,以及面向�(qū)ο蟮囊恍┨卣?懂設(shè)計(jì)模式的,一聽到"觀察者",就立馬知道什么意思。
一.下面看看安全的一些概念:
首先,我們來(lái)看看什么是安全性?
我們常常提起“實(shí)現(xiàn)安全性”“創(chuàng)建安全的系統(tǒng)”。所以安全性一般是定義很多,如:安全性就是保證系統(tǒng)可以完全按照我們想要的方式運(yùn)行;安全性就是防止以我們不希望的方式運(yùn)行系統(tǒng)...定義很多,但是不知道大家有沒(méi)有發(fā)現(xiàn),我們理解的安全的定義很狹窄的。怎么說(shuō)?我們一般認(rèn)為安全就是這樣的:采取一定的措施(主要是編程代碼的措施)處理程序運(yùn)行時(shí)的意外,或者防止意外發(fā)生。但是安全的問(wèn)題不僅僅只是代碼的問(wèn)題,所以在安全編程方面,我們要考慮的更多。
什么是安全
我們不能保證一個(gè)系統(tǒng)絕對(duì)的安全,不可能做到100%的安全。安全的定義的受到很多的限制,首先我們來(lái)看看一個(gè)例子。
我們都用過(guò)銀行的ATM機(jī),如果有人撿到了我們的卡想要盜取我們的錢,那么他只有猜我們的密碼。如果密碼的長(zhǎng)度只有一位數(shù),那么撿卡人第一次猜對(duì)的概率就是1/10,他只要十次就可以盜取我們的錢(假設(shè)可以不限次數(shù)的猜),那么系統(tǒng)的安全行很差;如果密碼是2位,那么密碼就有100中可能,那么撿卡人第一次才對(duì)的幾率就是1/100,第二次就是1/99,第三次1/98...系統(tǒng)的安全行也很差.
如果把密碼的嘗試限制在3次,如果密碼為2位數(shù),那么密碼被猜出的幾率就大大的減小了:
第一次猜中的幾率就是1/100
第二次猜中(第一次沒(méi)有中)的幾率就是(99/100) * (1/99)=0.01
第三次猜中(前兩次不中)的幾率就是(99/100)*(98/99)*(1/98)=0.01
三次之內(nèi)猜中的幾率就是:0.01+1.01+0.01=0.03
所以,當(dāng)我們限制了嘗試的次數(shù)的時(shí)候,系統(tǒng)就比之前安全了一些,但是系統(tǒng)還并不是很安全,只能說(shuō)比之前稍微的好了點(diǎn),但是風(fēng)險(xiǎn)依然很大。
為了使得系統(tǒng)更加的安全,就要減小系統(tǒng)的密碼被猜出的可能行,我們可以從兩個(gè)方面著手:
1.使得密碼嘗試的次數(shù)減小,如用戶只能輸入一次密碼;
2.加大密碼的位數(shù),如6位。這樣密碼被猜出的幾率就更加的小了,風(fēng)險(xiǎn)也小了很多,系統(tǒng)的安全行就又提高了。所以,我們常說(shuō)安全不安全的,都只是一個(gè)相對(duì)的概念。說(shuō)了這么多,就是要說(shuō)一點(diǎn):不要把安全看死了,安全不安全要看我們的環(huán)境。
在談后面的話題之前,讓我們來(lái)共享一些術(shù)語(yǔ):
脆弱性是系統(tǒng)的一個(gè)特征,它可能會(huì)使得應(yīng)用系統(tǒng)不安全按照我們預(yù)想的方式運(yùn)行。一般表示系統(tǒng)不好的特征。
威脅就是指利用錯(cuò)人性破環(huán)系統(tǒng)安全的可能行。
利用就是利用脆弱行的方法。
總結(jié)一句話就是:脆弱行導(dǎo)致了威脅,利用則實(shí)現(xiàn)了威脅,簡(jiǎn)言之,攻擊。
二、Web應(yīng)用中的安全問(wèn)題
首先我們就看看對(duì)Web的攻擊。攻擊有很多種的,其中一部分可以使用ASP.NET代碼進(jìn)行防范的,但是其他的攻擊方式還是可以產(chǎn)生破壞的,如直接攻擊服務(wù)器。下面就來(lái)看典型的例子。
我們之前說(shuō)過(guò),攻擊就是利用系統(tǒng)的脆弱性以實(shí)現(xiàn)一定的威脅。攻擊的結(jié)果也很多,如:
未經(jīng)授權(quán)的訪問(wèn)--用戶獲取了更多的權(quán)限,從而可以將應(yīng)用程序用于其他的途徑,如果獲取了網(wǎng)站的管理員的密碼,散布政治言論。
代碼執(zhí)行--在目標(biāo)系統(tǒng)上運(yùn)行惡意代碼,而且還會(huì)導(dǎo)致其他的威脅,如木馬。
拒絕服務(wù)--合法用戶被禁止訪問(wèn)應(yīng)用程序
信息失竊--機(jī)密的信息被盜取
破壞信息--信息遭到修改。如,站點(diǎn)被涂改,發(fā)布攻擊性的消息和政治言論。
下面我們就來(lái)看看常見的一些脆弱性,以及對(duì)它們的利用,以及引起的威脅。
緩沖區(qū)溢出
這個(gè)問(wèn)題由來(lái)已久,而且到現(xiàn)在為止,也是Web應(yīng)用種最常被利用的脆弱性。
當(dāng)應(yīng)用程序的外部輸入沒(méi)有經(jīng)過(guò)檢查就被插入內(nèi)存的時(shí)候,就會(huì)存在緩沖區(qū)溢出的脆弱性。如果插入的長(zhǎng)度超過(guò)了內(nèi)存中為此分配的空間的長(zhǎng)度,輸入就溢出,可能將占據(jù)內(nèi)存中的其他的地方,甚至運(yùn)行惡意的代碼。
對(duì)緩沖區(qū)溢出的主要利用就是把附加的數(shù)據(jù)寫到內(nèi)存中緩沖區(qū)的其他地方,這樣就常常導(dǎo)致程序的崩潰,因?yàn)閮?nèi)存破壞了,這也是拒絕服務(wù)器的攻擊方式,如果附加的數(shù)據(jù)設(shè)計(jì)的很巧妙的話,附加的數(shù)據(jù)還可以重寫函數(shù)的返回地址,那么程序就按照攻擊者的意愿執(zhí)行,病毒,木馬就是這樣。
當(dāng)然,在c++中,這個(gè)問(wèn)題很常見,因?yàn)镃++可以直接操作內(nèi)存地址,進(jìn)行很底層的操作。但是在.NET中是否也有這個(gè)問(wèn)題?
因?yàn)?net是基于托管代碼的,也就是說(shuō).net的代碼不是直接操作內(nèi)存,而是在中間隔了一層CLR。托管代碼的執(zhí)行要靠CLR來(lái)為止作為邊界檢查,所以CLR中的任何脆弱性都將轉(zhuǎn)變?yōu)閼?yīng)用程序的脆弱性。如果有高手知道了CLR的問(wèn)題,那么,托管代碼也出問(wèn)題。
腳本注入和跨站腳本攻擊
任何時(shí)候我們都要有這個(gè)心理:用戶都是惡意的。所以我們不能信任用戶的任何輸入,在用戶輸入的時(shí)候一定要檢驗(yàn)。假如沒(méi)有正確的處理好用戶的輸入,就可能在程序中引入腳本注入的脆弱性。該脆弱性允許用戶將自己額腳本注入到數(shù)據(jù)中,如在用戶留言中,用戶插入<script>alert('error');</script>,那么我們的留言的頁(yè)面就中是彈出提示。
跨站腳本的攻擊一般表現(xiàn)為一個(gè)在URL參數(shù)中帶有客戶端的腳本。這些腳本用來(lái)盜取用戶的cookie信息等,
我們這里只是簡(jiǎn)單的說(shuō)下,后面的一些文章還會(huì)具體的談,以及解決方案。
SQL注入
相信這個(gè)問(wèn)題,大家或多或少都知道一些,主要是惡意的用戶在我們的程序的數(shù)據(jù)庫(kù)中執(zhí)行精心設(shè)計(jì)的SQL語(yǔ)句。而且威脅很大,設(shè)置可以獲取服務(wù)器的管理員的權(quán)限。
分布式拒絕服務(wù)
也稱為DDOS(Disrtibute Denial Of Service)。DDOS攻擊主要就是用大量的計(jì)算機(jī)攻擊一個(gè)系統(tǒng)。很多的計(jì)算機(jī)聯(lián)合起來(lái)就可以發(fā)送很多的虛假的請(qǐng)求,以至于被攻擊的系統(tǒng)超負(fù)荷,而不能向其他的用戶提供服務(wù)。
蓄意工具者為了發(fā)動(dòng)DDOS,就必須獲取足夠多的機(jī)器。惡意的用戶設(shè)計(jì)在別人的電腦上注入木馬和病毒,獲取機(jī)器的控制權(quán),"借"別人的電腦發(fā)送攻擊。被控制的電腦就是所謂的"僵尸"。
DDOS攻擊一般來(lái)攻擊服務(wù)器,而且攻擊的方式也是防不勝防,很多的防護(hù)軟件和防火墻不能區(qū)分正確的請(qǐng)求和虛假的請(qǐng)求。
人的問(wèn)題
有時(shí)候,被利用的脆弱性不是技術(shù)上的脆弱性,而是人的脆弱性。如果用戶沒(méi)有安全的意識(shí),就容易受騙,而為攻擊者打開系統(tǒng)的。方式很多,如用Email欺騙用戶,誘使用戶執(zhí)行一些程序,還有就是蠕蟲...
蠻力攻擊
如果不采取一定的措施防止用戶無(wú)休止的嘗試連接應(yīng)用程序,那么我們就容易受到不計(jì)其數(shù)的猜測(cè)密碼口令的攻擊,即蠻力攻擊。
攻擊的方式主要就是設(shè)計(jì)一個(gè)程序,用它向目標(biāo)應(yīng)用發(fā)送很多的請(qǐng)求以測(cè)試不同的密碼口令。
有一點(diǎn)要注意:考慮安全問(wèn)題的時(shí)候,我們常常把程序比作為一個(gè)城堡,在城堡的周圍建造城墻并且嚴(yán)格盤查各個(gè)通道。保護(hù)Web程序與此類似,但是,如果這樣,那么我們對(duì)于已經(jīng)進(jìn)入城堡的用戶就無(wú)計(jì)可施了。
分享:如何使用ASP.NET Image Generation生成圖片縮略圖及水印ASP.NET Image Generation內(nèi)置了ImageResizeTransform類,可以實(shí)現(xiàn)圖片大小調(diào)整功能。也可以擴(kuò)展ImageTransform實(shí)現(xiàn)自己的圖片變換類。 下面使用ASP.NET Image Generation生成圖片縮略圖及水印的代碼。 數(shù)據(jù)庫(kù) 以下為引用的內(nèi)容: CREATE
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實(shí)例(可帶附件)
- js實(shí)現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實(shí)現(xiàn)
- Asp.Net 無(wú)刷新文件上傳并顯示進(jìn)度條的實(shí)現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問(wèn)題探討
- VS2010 水晶報(bào)表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(kù)(連接字符串的配置及獲取)
- asp.net頁(yè)面?zhèn)髦禍y(cè)試實(shí)例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲(chǔ)過(guò)程實(shí)現(xiàn)分頁(yè)示例代碼
.Net教程Rss訂閱編程教程搜索
.Net教程推薦
- 專家詳解:復(fù)雜表達(dá)式的執(zhí)行步驟
- 如何使ASP.NET 避免頁(yè)面重新整理時(shí)重復(fù)送出
- 在ASP.NET程序中創(chuàng)建唯一序號(hào)
- asp.net中生成縮略圖并添加版權(quán)
- ASP.NET網(wǎng)站開發(fā)的架構(gòu)設(shè)計(jì)
- 淺析8月編程語(yǔ)言榜:.Net前景如何?
- 揭秘ASP.NET實(shí)現(xiàn)頁(yè)面間值傳遞的幾種方法
- ASP.NET記錄錯(cuò)誤日志的實(shí)現(xiàn)方法
- 解析ASP.NET中基類Page_Load方法后執(zhí)行原因
- .net教程:ASP.NET GridView的分頁(yè)功能
- 相關(guān)鏈接:
- 教程說(shuō)明:
.Net教程-如何創(chuàng)建安全的Web應(yīng)用程序
。