如何創建安全的Web應用程序_.Net教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:解讀ASP.NET安全架構
      在開發Web程序中,我們可以選擇用自己的方法來實現安全的策略,或者可以購買第三方的安全代碼和產品,不管怎么樣,都是要很大的花費的,幸好在.NET Framework中已經內置了安全的解決方案。 ASP.NET和 .NET Framework 聯合IIS為Web應用程序安全提供了一個基礎

      把一個問題說清楚,是要有前提的,也要大家有一些通過的詞匯,就像大家談OO,就知道談的面向對象,以及面向對象的一些特征;懂設計模式的,一聽到"觀察者",就立馬知道什么意思。

      一.下面看看安全的一些概念:

      首先,我們來看看什么是安全性?

      我們常常提起“實現安全性”“創建安全的系統”。所以安全性一般是定義很多,如:安全性就是保證系統可以完全按照我們想要的方式運行;安全性就是防止以我們不希望的方式運行系統...定義很多,但是不知道大家有沒有發現,我們理解的安全的定義很狹窄的。怎么說?我們一般認為安全就是這樣的:采取一定的措施(主要是編程代碼的措施)處理程序運行時的意外,或者防止意外發生。但是安全的問題不僅僅只是代碼的問題,所以在安全編程方面,我們要考慮的更多。

      什么是安全

      我們不能保證一個系統絕對的安全,不可能做到100%的安全。安全的定義的受到很多的限制,首先我們來看看一個例子。

      我們都用過銀行的ATM機,如果有人撿到了我們的卡想要盜取我們的錢,那么他只有猜我們的密碼。如果密碼的長度只有一位數,那么撿卡人第一次猜對的概率就是1/10,他只要十次就可以盜取我們的錢(假設可以不限次數的猜),那么系統的安全行很差;如果密碼是2位,那么密碼就有100中可能,那么撿卡人第一次才對的幾率就是1/100,第二次就是1/99,第三次1/98...系統的安全行也很差.

      如果把密碼的嘗試限制在3次,如果密碼為2位數,那么密碼被猜出的幾率就大大的減小了:

      第一次猜中的幾率就是1/100

      第二次猜中(第一次沒有中)的幾率就是(99/100) * (1/99)=0.01

      第三次猜中(前兩次不中)的幾率就是(99/100)*(98/99)*(1/98)=0.01

      三次之內猜中的幾率就是:0.01+1.01+0.01=0.03

      所以,當我們限制了嘗試的次數的時候,系統就比之前安全了一些,但是系統還并不是很安全,只能說比之前稍微的好了點,但是風險依然很大。

      為了使得系統更加的安全,就要減小系統的密碼被猜出的可能行,我們可以從兩個方面著手:

      1.使得密碼嘗試的次數減小,如用戶只能輸入一次密碼;

      2.加大密碼的位數,如6位。這樣密碼被猜出的幾率就更加的小了,風險也小了很多,系統的安全行就又提高了。所以,我們常說安全不安全的,都只是一個相對的概念。說了這么多,就是要說一點:不要把安全看死了,安全不安全要看我們的環境。

      在談后面的話題之前,讓我們來共享一些術語:

      脆弱性是系統的一個特征,它可能會使得應用系統不安全按照我們預想的方式運行。一般表示系統不好的特征。

      威脅就是指利用錯人性破環系統安全的可能行。

      利用就是利用脆弱行的方法。

      總結一句話就是:脆弱行導致了威脅,利用則實現了威脅,簡言之,攻擊。

      二、Web應用中的安全問題

      首先我們就看看對Web的攻擊。攻擊有很多種的,其中一部分可以使用ASP.NET代碼進行防范的,但是其他的攻擊方式還是可以產生破壞的,如直接攻擊服務器。下面就來看典型的例子。

      我們之前說過,攻擊就是利用系統的脆弱性以實現一定的威脅。攻擊的結果也很多,如:

      未經授權的訪問--用戶獲取了更多的權限,從而可以將應用程序用于其他的途徑,如果獲取了網站的管理員的密碼,散布政治言論。

      代碼執行--在目標系統上運行惡意代碼,而且還會導致其他的威脅,如木馬。

      拒絕服務--合法用戶被禁止訪問應用程序

      信息失竊--機密的信息被盜取

      破壞信息--信息遭到修改。如,站點被涂改,發布攻擊性的消息和政治言論。

      下面我們就來看看常見的一些脆弱性,以及對它們的利用,以及引起的威脅。

      緩沖區溢出

      這個問題由來已久,而且到現在為止,也是Web應用種最常被利用的脆弱性。

      當應用程序的外部輸入沒有經過檢查就被插入內存的時候,就會存在緩沖區溢出的脆弱性。如果插入的長度超過了內存中為此分配的空間的長度,輸入就溢出,可能將占據內存中的其他的地方,甚至運行惡意的代碼。

      對緩沖區溢出的主要利用就是把附加的數據寫到內存中緩沖區的其他地方,這樣就常常導致程序的崩潰,因為內存破壞了,這也是拒絕服務器的攻擊方式,如果附加的數據設計的很巧妙的話,附加的數據還可以重寫函數的返回地址,那么程序就按照攻擊者的意愿執行,病毒,木馬就是這樣。

      當然,在c++中,這個問題很常見,因為C++可以直接操作內存地址,進行很底層的操作。但是在.NET中是否也有這個問題?

      因為.net是基于托管代碼的,也就是說.net的代碼不是直接操作內存,而是在中間隔了一層CLR。托管代碼的執行要靠CLR來為止作為邊界檢查,所以CLR中的任何脆弱性都將轉變為應用程序的脆弱性。如果有高手知道了CLR的問題,那么,托管代碼也出問題。

      腳本注入和跨站腳本攻擊

      任何時候我們都要有這個心理:用戶都是惡意的。所以我們不能信任用戶的任何輸入,在用戶輸入的時候一定要檢驗。假如沒有正確的處理好用戶的輸入,就可能在程序中引入腳本注入的脆弱性。該脆弱性允許用戶將自己額腳本注入到數據中,如在用戶留言中,用戶插入<script>alert('error');</script>,那么我們的留言的頁面就中是彈出提示。

      跨站腳本的攻擊一般表現為一個在URL參數中帶有客戶端的腳本。這些腳本用來盜取用戶的cookie信息等,

      我們這里只是簡單的說下,后面的一些文章還會具體的談,以及解決方案。

      SQL注入

      相信這個問題,大家或多或少都知道一些,主要是惡意的用戶在我們的程序的數據庫中執行精心設計的SQL語句。而且威脅很大,設置可以獲取服務器的管理員的權限。

      分布式拒絕服務

      也稱為DDOS(Disrtibute Denial Of Service)。DDOS攻擊主要就是用大量的計算機攻擊一個系統。很多的計算機聯合起來就可以發送很多的虛假的請求,以至于被攻擊的系統超負荷,而不能向其他的用戶提供服務。

      蓄意工具者為了發動DDOS,就必須獲取足夠多的機器。惡意的用戶設計在別人的電腦上注入木馬和病毒,獲取機器的控制權,"借"別人的電腦發送攻擊。被控制的電腦就是所謂的"僵尸"。

      DDOS攻擊一般來攻擊服務器,而且攻擊的方式也是防不勝防,很多的防護軟件和防火墻不能區分正確的請求和虛假的請求。

      人的問題

      有時候,被利用的脆弱性不是技術上的脆弱性,而是人的脆弱性。如果用戶沒有安全的意識,就容易受騙,而為攻擊者打開系統的。方式很多,如用Email欺騙用戶,誘使用戶執行一些程序,還有就是蠕蟲...

      蠻力攻擊

      如果不采取一定的措施防止用戶無休止的嘗試連接應用程序,那么我們就容易受到不計其數的猜測密碼口令的攻擊,即蠻力攻擊。

      攻擊的方式主要就是設計一個程序,用它向目標應用發送很多的請求以測試不同的密碼口令。

      有一點要注意:考慮安全問題的時候,我們常常把程序比作為一個城堡,在城堡的周圍建造城墻并且嚴格盤查各個通道。保護Web程序與此類似,但是,如果這樣,那么我們對于已經進入城堡的用戶就無計可施了。

      分享:如何使用ASP.NET Image Generation生成圖片縮略圖及水印
      ASP.NET Image Generation內置了ImageResizeTransform類,可以實現圖片大小調整功能。也可以擴展ImageTransform實現自己的圖片變換類。 下面使用ASP.NET Image Generation生成圖片縮略圖及水印的代碼。 數據庫 以下為引用的內容: CREATE

      來源:模板無憂//所屬分類:.Net教程/更新時間:2009-07-23
      相關.Net教程