把一個問題說清楚,是要有前提的,也要大家有一些通過的詞匯,就像大家談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代碼進行防范的,但是其他的攻擊方式還是可以產生破壞的,如直接攻擊服務器。下面就來看典型的例子。
我們之前說過,攻擊就是利用系統的脆弱性以實現一定的威脅。攻擊的結果也很多,如:
未經授權的訪問--用戶獲取了更多的權限,從而可以將應用程序用於其他的途徑,如果獲取了網站的管理員的密碼,散布政治言論。
代碼執行--在目標系統上運行惡意代碼,而且還會導致其他的威脅,如木馬。
拒絕服務--合法用戶被禁止訪問應用程序
信息失竊--機密的信息被盜取
破壞信息--信息遭到修改。如,站點被塗改,發布攻擊性的消息和政治言論。
下面我們就來看看常見的一些脆弱性,以及對它們的利用,以及引起的威脅。