"安全性"的定義
安全性是系統設計、實作和管理的一部分,其作用是保證系統可以完全按照人們想要的方式運作。從另一個角度來說,安全性的作用是防止以我們不希望出現的方式使用系統。
"安全"的含義
我們永遠不能保證一個系統是完全安全的。這就是說,"安全"并不意味着"百分之百的安全".使用"安全"一詞時,實際上是說,如果要憑借現有的知識基礎以我們不希望的方式使用系統,那是基本不可能的,進而不必考慮這種情況的發生機率。個人了解這句話是,安全性的提高是減少發生不安全行為的機率。如果當機率足夠小的時候,就可以認為是安全的。
安全的其他定義
脆弱性(vulnerability)是系統的一個特征,它可能會使應用程式不完全按照預想的方式運作。容易遭受攻擊的狀态。
威脅(threat)指利用脆弱性破壞系統安全的可能性。
利用(exploit)是一種利用脆弱性的方法,其目的是實作威脅并讓系統按照非原定計劃的方式運作。在利用脆弱性之前,風險隻是理論上的說法。
有些利用模型很小,但他也有些利用将建立複雜的代碼.現在對流行軟體的脆弱性的新利用,是每時每刻都在進行着的事情。
将這三個概念放在一起看,脆弱性導緻了威脅,利用則實作威脅。這個過程就是通常所說的攻擊(attack)。
Web應用程式的攻擊類型
1.未經授權的通路--使用者獲得了更多的權限,進而可以将應用程式用于其他途徑。這種威脅常常導緻其他的威脅,但它可以自行終止。
2.代碼執行--在目标系統上運作惡意代碼。
3.拒絕服務--合法使用者被禁止通路應用程式。
4.資訊失竊--私有資訊受到危害。
5.破壞資訊--資訊遭到修改。
對Web應用程式的攻擊方式
1.緩沖區溢出
2.腳本注入和跨站點腳本處理
3.SQL注入
4.分布式拒絕服務
5.社交工程
6.蠻力攻擊
安全并不僅僅是攔賊于門外
安全還包括在系統内特定使用者通路特定權限。使用者不能通路沒有配置設定的權限。
安全由誰來負責
程式設計者需要保證程式的結構是安全的。
網絡管理者要保證網絡和伺服器是安全的。
程式員要保證他們的代碼不會引入脆弱性。
管理人員要保證他們的團隊戒備安全問題。
資料庫管理者要確定資料庫伺服器沒有脆弱性。
使用者需要提防交社交工程攻擊等事情。
當然,還有其他很多任務要做好分開,才能實作安全。
ASP.NET開發人員力所不及的安全問題
1. 網絡
Web應用程式是依附于網絡才能有效運作的。如果網絡連接配接因為受到拒絕服務式攻擊而被中斷了,應用程式将不再運作。假如惡意使用者可以偵聽網絡通信量,他們就可以采集到那些不允許他們通路的資訊。
2. Web伺服器
支援應用程式的伺服器必須是安全的。否則,惡意使用者可能肆意更改應用程式,而我們所做的安全工作也将徒勞無功。
為了給ASP.NET提供安全的運作環境,必須對 Windows和Internet資訊服務(IIS)進行安全配置。對Windows的配置走出了本書的範圍,但考慮到很多ASP.NET開發人員同時也負責配置IIS。
3. 資料庫伺服器
大部分ASP.NET應用程式都要用到資料庫。如果資料庫被破壞了,應用程式就會受到影響。
4. 用戶端
盡管用戶端代碼對我們很有用處,可我們終究不能控制用戶端。舉個例子講,Javascript的确認代碼是很有用的,可是總有辦法繞過。
ASP.NET開發人員的職責
1. 将安全放在第一位
建構并維護具有一定安全等級的系統,是一件重要而又困難的事情,可很多公司員工認識不到這一點。過去的一段時間裡,安全往往是被視為外部問題,而不是作為核心問題來考慮的。
客戶和管理者永遠也不會同意為了某個功能而花費金錢,除非他們能夠看到明顯的好處。如果要獲得在安全問題上投入時間和金錢的好處,就要了解忽視安全問題所帶來的風險。
作為程式員,有責任教育公司裡的其他人,使他們懂得安全的重要性。我們應該確定人們不再像以前那樣輕描淡寫地讨論安全問題,而是把它當做一個核心功能能引入系統。還要確定安全在應用程式部署以及其他方面都保持有優先的權利。
安全功能永遠都應該是系統的一個核心功能。如果不是,我們應該要求它得到重視。
2. 實作穩固的安全功能
為了達到系統安全的目的,作為ASP.NET開發人員,我們顯然應該在應用程式中增加功能,使它支援安全性。對控制應用程式的使用方式進行一些恰當的選擇,這也是我們肩負的責任。
請務必記住,最安全的系統都是經過嚴格測試和審查的。這意味着解決安全問題的時候,使用已有的解決方案幾乎總是比自己編寫代碼要好。即使是對已有的方案做很小的修改,也要進行周密的檢查,確定修改不會破壞安全。
3. 避免增加新的脆弱性
向應用程式中增加的每一句代碼,都可能會增添新的脆弱性。對這部分新代碼必須嚴格審查,以確定它們不會造成可能危及應用程式的安全漏洞。一個相對好的方法是,從最初階段就確定開發中的應用程式的每部分都是安全的。
4. 幫助使用者提高安全意識
教育使用者使他們懂得安全問題,這是非常有益的。從實施社交攻擊的人數就可以看出,現在使用者本身就提供了經常被利用的脆弱性。
可是不管怎樣努力地教育使用者,總是還有使用者對他人的建議不加重視。是以,在安全問題上不能夠依賴使用者。對待使用者不妨強制他們盡可能地保證安全,不給非技術人員作出決定的機會,因為他們的決定可能造成不安全。
5. 警惕資料的流動和洩漏
資料可能由連線流入用戶端的時候更是如此,因為用戶端是我們不能控制的。
6. 保持更新
大部分的脆弱性都是在出現不久就被解決,這往往是由軟體廠商釋出更新檔來實作的,緊跟他們的動态,使用更新檔,接受保護。
一些安全建議
1.沒有百分之百的安全,但還是應該盡可能地加強防範。
2.隐藏起來并不安全,永遠假定攻擊者知曉系統内情。
3.應用程式的安全程度由它最薄弱的環境決定,把系統每個部分都看作可能遭受攻擊的對象,并注意和其他系統安全負責人員保持良好的溝通。
4.安全問題在開發過程的每一階段都很重要,優先考慮安全問題,不要出了問題再後悔。
5.安全領域的工作是做不完的,若要維護安全,請制定動态工作計劃。
6.過分限制的安全可能不利于産品開發,要考慮到系統的日常使用者如何對待安全系統。