| 本單元內容 | |
| 目標 | |
| 適用於 | |
| 如何使用本單元 | |
| 架構及設計的檢閱程序 | |
| 部署與基礎結構的考量 | |
| 輸入驗證 | |
| 驗證 | |
| 授權 | |
| 設定管理 | |
| 機密資料 | |
| 工作階段管理 | |
| 密碼編譯 | |
| 參數操作 | |
| 例外管理 | |
| 稽核和記錄 | |
| 總結 | |
| 其他資源 |
要建置安全的 Web 應用程式需要有適當的架構及設計。在開發之後再翻新改造安全性所花的成本和努力太高昂了。架構及設計的檢閱可以幫助在開始開發階段之前,驗證應用程式中與安全性相關的設計功能。這使可能的弱點在被利用之前得以被識別和修補,而且可以將修補所需的付出降到最低。
本單元提供對架構設計執行徹底的檢閱時所應該提出的問題。即使您已有現存的應用程式,仍應該閱讀本單元,然後在應用程式設計時,重新造訪使用到的觀念、原理及技術。
透過本單元即可:
| • | 知道當對架構設計執行徹底的檢閱時應該提出什麼問題。 |
| • | 分析 Web 應用程式架構及設計。 |
| • | 發展及加強現行安全性檢閱辦法。 |
| • | 在設計階段建立一個程序來修補弱點。 |
| • | 識別關鍵應用程式部署及架構安全性考慮事項。 |
| • | 確保順利與安全的 Web 應用程式部署。 |
Web 應用程式
若要充分瞭解本單元:
| • | 將安全性檢閱整合到架構設計程序中。儘快開始,當設計變更時,使用本單元指定的步驟來檢閱異動。 |
| • | 發展安全性檢閱。本單元提供為加強設計的安全性所提出的問題。若要完成此檢閱程序,也需要加入對您獨特應用程式的特定問題。 |
| • | 瞭解可能的潛在威脅。單元 2<潛在威脅及因應對策>,列出會影響應用程式中不同元件和層級的潛在威脅。必須瞭解這些潛在威脅才能加強檢閱程序的結果。 |
架構及設計的檢閱程序從安全性的觀點分析架構及設計。如果您剛完成設計,有關的設計文件在您進行此程序時可以提供協助。無論您的設計文件是多麼的齊全,您必須能夠分解您的應用程式並且識別關鍵項目,包括信任界限、資料流程、進入點、和特殊權限程式碼。也必須知道應用程式的實體部署組態。注意對於最通常顯示出弱點的區域所採用的設計方法。本指南把這些稱為「應用程式弱點類別」。
當檢閱應用程式架構及設計時,請考慮下列的觀點:
| • | 「部署及架構」。檢視有關於目標部署環境及相關安全性原則的應用程式設計。同時考慮基礎架構層級安全性所加諸的限制。 |
| • | 應用程式結構及設計。檢視應用程式中關鍵區域的方法,包括驗證、授權、輸入驗證、例外管理、和其他區域。可以使用應用程式弱點類別作為藍圖,以確認在檢閱時沒有遺漏任何關鍵區域。 |
| • | 逐層分析。逐步走過應用程式的各個邏輯層,並且檢查 ASP.NET 網頁及控制元、Web 服務、服務元件、Microsoft .NET 遠端服務、資料存取程式碼、和其他的安全性。 |
[圖 5.1] 顯示檢閱程序的三向同步執行法。

[圖 5.1]
應用程式檢閱
本單元的餘下部分顯示在每一個這些特殊的區域檢閱程序期間關鍵的考慮事項和問題。
檢查提供給應用程式的基礎網路及主機架構的安全性設定,並且檢查目標環境可能加諸的限制。同時考慮部署拓樸和在設計上的中間層應用程式伺服器、外圍區域、和內部防火牆的衝擊。
檢閱下列問題以識別可能的部署及架構問題:
| • | 網路是否可以提供安全的通訊? |
| • | 您的部署拓樸是否包括內部的防火牆? |
| • | 您的部署拓樸是否包括遠端應用程式伺服器? |
| • | 架構的安全性加諸了什麼限制? |
| • | 您是否有考慮 Web 伺服器陣列問題? |
| • | 目標環境支援什麼樣的信任等級? |
當資料在用戶端及伺服器之間,或伺服器到伺服器之間傳輸時是最脆弱的。資料應該多麼隱密?在法律上您是否為客戶資料負責?
應用程式負責在資料傳輸前安全地處理及轉換,而網路負責在資料傳輸時的完整性及隱私性。有需要時使用適當的加密演算法來維持資料的隱私。另外,確認網路裝置是安全的,因為它們維護著網路的完整性。
如果有內部的防火牆將 Web 伺服器與應用程式伺服器或資料庫伺服器隔開,檢閱下列問題以確保設計有容納此:
| • | 下游伺服器如何驗證 Web 伺服器? 如果使用網域帳戶及 Windows 驗證,防火牆是否有開啟需要的連接埠?如果不是,或如果 Web 伺服器及下游伺服器是在不同的網域,可以使用鏡像的本機帳戶。例如,可以複裝最小權限本機 ASPNET 帳戶,用來執行在資料庫伺服器上的 Web 應用程式。 |
| • | 您是否使用分散式交易? 如果 Web 伺服器使用 Microsoft 分散式交易協調器 (DTC) 的服務啟始分散式交易,內部的防火牆是否有開啟 DTC 通訊需要的連接埠? 有關使用 DTC 通過防火牆的詳細資料,請參閱 Microsoft 知識庫文件 250367《INFO: Configuring Microsoft Distributed Transaction Coordinator (DTC) to Work Through a Firewall (英文)》網址為: |
如果部署拓樸包括實體的遠端中間層,請檢閱下列問題:
| • |
您是否有使用 Enterprise Services?
「注意事項」:在一些狀況下,使用中間層 Web 服務做為 Enterprise Services 應用程式的前端是絕佳的設計選擇。使用這個方法,Web 伺服器可以經由連接埠 80 使用簡易物件存取通訊協定 (SOAP) 來和應用程式伺服器彼此通訊。 如需詳細資訊,請參閱下列 Microsoft 知識庫文件:
| ||||||||
| • |
您是否有使用 .NET 遠端服務?
| ||||||||
| • |
您是否有使用 Web 服務?
|
設計上是否有主機架構安全性限制會失效的任何假設?例如,基於所需要的服務、通訊協定、或帳戶權限的可用性,在設計上必須對安全性限制有所取捨。請檢閱下列問題:
| • |
所依靠的服務或通訊協定是否可能會不可用?
|
| • |
您是否有依賴機密的帳戶權限?
例如,應用程式是否需要建立執行緒層級的模擬權杖以建立服務識別身份來存取資源?這需要「充當部分作業系統」的權限,因為與入侵處理程序有關的安全性風險日益增加,因此該權限不應該賦予 Web 伺服器的處理程序。如果需要此項功能,設計上應該區隔化較高的權限,例如,在程序之外的 Enterprise Services 應用程式。 |
如果應用程式將被部署在 Web 伺服器陣列,就無法假設陣列中的那一部伺服器會處理用戶端的要求。來自同一用戶端的後續要求可能是由不同的伺服器來提供服務。因此,需要考慮下列的問題:
| • |
您如何管理工作階段狀態?
|
| • |
您是否有使用機器專屬的加密金鑰?
|
| • |
您是否有使用表單驗證或受保護檢視狀態?
|
| • |
您是否有使用 Secure Sockets Layer (SSL)?
如果在負載平衡器上終止 SSL,從負載平衡器到 Web 伺服器之間的網路資料傳輸就沒有加密。這表示攻擊者可以竊聽在負載平衡器和 Web 伺服器之間傳輸的已解密網路資料傳輸。可以確保 Web 伺服器環境中實體設備的安全性,或使用 IPSec 原則提供的傳輸層級加密來保護內部的資料中心連結,以應付這個潛在威脅。 |
目標環境的程式碼存取安全性信任等級決定了程式碼可以存取的資源及執行的特殊權限作業。檢查目標環境支援的信任等級。如果 Web 應用程式被允許使用完全信任來執行,視作業系統安全性而定,程式碼可以存取任何資源。
如果應用程式必須使用降低信任等級來執行,就會限制資源的類型及程式碼可以執行的特殊權限作業。在不完全信任的狀況下,設計上必須沙箱特殊權限程式碼。也應該使用不同的組件來隔離特殊權限程式碼。會這樣做,讓特殊權限程式碼可以從其餘的應用程式分開被設定,並獲得需要的額外程式碼存取權限。
有關更多詳細資訊,請參閱單元 9<配合 ASP.NET 使用程式碼存取安全性>。
「注意事項」:如果計劃在共用伺服器上部署應用程式,或由主機代管公司來執行應用程式時,信任等級通常會是一個問題。在這些例子,檢查安全性原則並找出它對 Web 應用程式委予的信任等級。
檢查應用程式如何驗證輸入,因為許多 Web 應用程式攻擊就是使用蓄意的畸形輸入。SQL 注入、跨網站指令碼 (XSS)、緩衝區溢位、程式碼注入、和許多其他的拒絕服務攻擊及權限提升攻擊都會利用不良的輸入驗證。[表 5.1] 指出最常見的輸入驗證弱點。
[表 5.1] 常見的輸入驗證弱點
| 弱點 | 含意 |
在超本文標記語言 (HTML) 輸出串流中的未檢驗輸入 | 應用程式容易受到 XSS 攻擊的影響。 |
未檢驗的輸入慣於產生 SQL 查詢 | 應用程式容易受到 SQL 注入攻擊的影響。 |
信任用戶端的驗證 | 用戶端的驗證很容易被跳過。 |
使用輸入檔案名稱、URL、或使用者名稱來做安全性的決定 | 應用程式容易受到標準化錯誤的影響,而導致安全性的問題。 |
針對惡意輸入的應用程式專用篩選器 | 這幾乎不可能做到正確,因為可能的惡意輸入範圍太大了。應用程式應該對輸入加以限制、拒絕、和安全性過濾。 |
檢閱下列問題以幫助識別可能的輸入驗證安全性問題:
| • | 您如何驗證輸入資料? |
| • | 您如何處理輸入資料? |
設計上指定什麼方法來驗證輸入?首先,設計應該佈局策略。應用程式應該對所有收到的輸入加以限制、拒絕、和安全性過濾。限制輸入是最好的方法,因為從已知正確的類型、模式和範圍來驗證資料,遠比尋找已知的錯誤字元來驗證資料容易的多了。使用潛在防衛策略,應該也要拒絕已知的錯誤輸入和安全性過濾輸入。
下列問題可以幫助識別可能的弱點:
| • |
您是否知道您的進入點?
|
| • |
您是否知道您的信任界限?
|
| • |
您是否有驗證網頁輸入?
|
| • |
您是否有驗證傳到元件或 Web 服務的引數?
|
| • |
您是否驗證擷取自資料庫的資料?
|
| • |
您是否使用集中式的方法?
|
| • |
您是否倚賴用戶端的驗證?
|
檢查應用程式如何處理輸入,因為不同類型的處理程序會導致不同類型的弱點。例如,如果在 SQL 查詢中使用輸入,應用程式就可能受到 SQL 注入的影響。
檢閱下列的問題來幫助識別可能的弱點:
| • |
您的應用程式是否容易受到標準化問題的影響?
|
| • |
您的應用程式是否容易受到 SQL 注入的影響?
|
| • |
您的應用程式是否容易受到 XSS 攻擊的影響?
|
檢查應用程式如何驗證其呼叫者、在何處使用驗證、以及當在儲存和在網路上傳送時如何確認憑證仍然安全。在驗證的弱點會使應用程式容易受到欺騙攻擊、字典攻擊、連線劫持、和其他攻擊的影響。[表 5.2] 指出最常見的驗證弱點。
[表 5.2] 常見的驗證弱點
| 弱點 | 含意 |
安全性不足的密碼 | 增加密碼破解和字典攻擊的風險。 |
組態檔案中的透明 (無加密) 文字認證資料 | 可以存取伺服器的內部人員或利用主機弱點下載組態檔案的攻擊者,會立即存取到認證資料。 |
在網路上傳送透明 (無加密) 文字認證資料 | 攻擊者可以監測網路來偷竊驗證憑證並偽造識別身份。 |
權限過高的帳戶 | 處理序或帳戶遭到入侵時相關的風險會增加。 |
冗長的工作階段 | 連線劫持相關的風險會增加。 |
混合個人化和驗證 | 個人化資料適用於永續性的 cookie。驗證 Cookie 不應該被永續留存。 |
檢閱下列問題來識別在應用程式執行驗證的方式上可能的弱點:
| • | 您是否有隔離公共和限制存取? |
| • | 您是否有識別服務帳戶的需求? |
| • | 您如何驗證呼叫者? |
| • | 您如何使用資料庫驗證? |
| • | 您是否有強制實施增強式帳戶管理實作? |
如果應用程式提供不需驗證的公共區域和需要驗證的限制區域,檢查在設計上站台如何區別兩者。對於限制的網頁和資源應該使用分開的子資料夾,然後在網際網路資訊服務 (IIS) 設定它們需要 SSL 來保護那些資料夾。這個方法容許對資密資料提供安全性,並在站台需要的區域使用 SSL 來驗證 Cookie。避免在整個站台使用 SSL 所造成效能的減低。
設計應該識別所需要的服務帳戶範圍以連接到不同資源,包括資料庫、目錄服務、和其他類型的遠端網路資源。確認在設計上不需要單一的、有足夠權限的高特殊權限帳戶來連接到不同資源類型的範圍。
| • |
設計是否需要最小權限帳戶?
|
| • |
應用程式是否需要維護服務帳戶憑證?
|
檢閱驗證呼叫者的以下各層面。使用的觀點視設計使用的驗證類型而定。
| • |
您是否有在網路連線上傳遞純文字憑證?
|
| • |
您是否有實施自已的使用者存放區?
如果驗證 SQL Server 使用者存放區中的憑證,請密切注意輸入的使用者名稱和密碼。檢查 SQL 字元的惡意注入。 |
| • |
您是否有使用表單驗證?
有關表單驗證的更多詳細資訊,請參閱單元 10<建置安全的 ASP.NET 網頁和控制項>及單元 19<保障 ASP.NET 應用程式及 Web 服務的安全>。 |
當應用程式連結到資料庫時,檢查使用什麼驗證機制、計劃使用那個或那些帳戶、以及如何在資料庫中授權應用程式。
下列問題幫助檢閱資料庫驗證的方法:
| • |
您是否有使用 SQL 驗證?
如果網路架構不提供 IPSec 加密通道,確認在提供自動 SQL 憑證加密的資料庫上安裝了伺服器憑證。同時也檢查計劃如何保障資料庫連結字串的安全,因為這些字串中包含了 SQL 帳戶使用者名稱和密碼。 |
| • |
您是否有使用處理程序帳戶?
如果計劃使用網域帳戶,確認其為最小權限帳戶並檢查所有在中間的防火牆有開啟相關的連接埠來支援 Windows 驗證。 |
| • |
您是否有使用服務帳戶?
同時也檢查那一個處理程序會被用來使用服務帳戶建立模擬安全性內容。這不應該由 Microsoft Windows 2000 上的 ASP.NET 應用程式處理程序來完成,因為它會強迫增加處理程序帳戶的權限並且賦予「充當部分作業系統」的權限。這應該被避免因為會大幅增加風險的因素。 |
| • |
您是否有考慮使用匿名 Internet 使用者識別身份?
|
| • |
您是否有使用原始使用者的識別身份?
|
| • |
您如何儲存資料庫連結字串?
有關連結到 SQL Server 的不同選項和安全地儲存資料庫連結字串的更多詳細資料,請參閱單元 14<建置安全的資料存取>。 |
如果應用程式使用 Windows 驗證,可透過 Windows 安全性原則來強制實施增強式密碼的使用、限制登入嘗試次數、及其他最佳實務帳戶管理原則。此外,這是由應用程式層在負責的。檢閱下列應用程式帳戶管理的觀點:
| • |
您的應用程式是否強制實施增強式密碼?
|
| • |
您是否有限制失敗登入嘗試的次數?
|
| • |
您在失敗事件中是否洩露了太多的資訊?
|
| • |
您是否有強制實施定期變更密碼?
|
| • |
您是否能夠在入侵事件時快速地停用帳戶」?
|
| • |
您的應用程式是否有記錄登入的嘗試?
|
檢查應用程式如何授權給它的使用者。同樣也檢查在資料庫內如何授權應用程式以及到系統層級資源的存取如何控制。授權弱點會導致資料公開、資料竄改、和權限提升。潛在防衛策略是可以套用到應用程式授權策略的關鍵性安全性原則。[表 5.3] 指出最常見的授權弱點。
[表 5.3] 常見的授權弱點
| 弱點 | 含意 |
信任單一閘道管理 | 如果該閘道管理被跳過或設定不正確,使用者會獲得未授權存取。 |
未能針對應用程式識別身份鎖定系統資源 | 攻擊者可以強迫應用程式存取受限制的系統資源。 |
未能對特定的預存程序限制資料庫存取 | 攻擊者掛上 SQL 注入攻擊來擷取、操作、或破壞資料。 |
不適當的權限分隔 | 沒有說明能力或執行每一使用者授權的能力。 |
檢閱下列問題來幫助驗證應用程式設計的授權策略:
| • | 您如何授與權限給一般使用者? |
| • | 您如何授與權限給資料庫中的應用程式? |
| • | 您如何限制對系統層級資源的存取? |
在設計時期應該從兩個觀點來考慮授權。首先,考慮一般使用者授權。哪個使用者可以存取哪個資源及執行哪個操作?其次,如何預防惡意使用者使用應用程式來存取系統層級的資源?檢閱下列問題來驗證應用程式的授權策略:
| • |
您是否有使用潛在防衛策略?
|
| • |
您有使用哪些閘道管理?
|
| • |
您是否有使用以角色為主的方法」?
|
| • |
您的角色是否提供足夠的權限分隔?
|
應用程式用來連結到資料庫的帳戶應該有應用程式所需要足夠的受限制能力,但也僅止於此。
| • |
應用程式是否有使用預存程序存取資料庫?
這對安全性有利,同時對效能和未來的可維護性也有益處。有關資料庫授權方法的更多詳細資料,請參閱單元 14<建置安全的資料存取>。 |
當設計應用程式時,考慮藉由應用程式所能存取的系統層級資源所加諸於應用程式的限制。應用程式應該只能被賦予存取到最少的所需資源。這是一個減輕風險的策略,如果應用程式被入侵時可以限制所造成的損害。考慮下列的問題:
| • |
您的設計是否有使用程式碼存取安全性?
|
| • |
您的應用程式使用什麼識別身份?
在部署時期,可以在系統層級資源設定適當的 ACL,以確保應用程式的識別身份只能存取到所需的資源。 有關程式碼存取安全性設計的更多詳細資訊,請參閱單元 9<配合 ASP.NET 使用程式碼存取安全性>。 |
如果應用程式提供可被設定的管理介面,檢查如何保障管理介面的安全。同樣也檢查如何保障機密組態資料的安全。[表 5.4] 顯示最常見的設定管理弱點。
[表 5.4] 常見的設定管理弱點
| 弱點 | 含意 |
不安全的管理 | 未授權的使用者可以重新設定應用程式以及 |
不安全的組態存放區 | 未授權的使用者可以存取組態存放區以及 |
純文字組態資料 | 任何可以登入到伺服器的人就可以看到機密的 |
系統管理員太多 | 這造成難以稽核和檢查系統管理員。 |
權限過高的處理序帳戶 | 這會容許權限提升攻擊。 |
檢閱下列問題來幫助驗證應用程式設計的設定管理方法:
| • | 您是否有支援遠端管理? |
| • | 您是否有保障組態存放區的安全? |
| • | 您是否有區分系統管理員權限? |
如果設計指定遠端管理,因為作業的機密本質以及管理介面上的資料是可存取的,所以必須保障管理介面和組態存放區的安全。檢閱下列遠端管理設計的觀點:
| • |
您是否有使用增強式的驗證?
|
| • |
您是否有加密網路資料傳輸?
|
識別應用程式的組態存放區,然後檢查限制存取存放區以及保障存放區內資料的方法。
| • |
您的組態存放區是否在 Web 空間?
|
| • |
在組態存放區中的資料安全嗎?
|
| • |
您如何限制到組態存放區的存取?
|
如果管理介面支援不同的功能 - 例如,站台內容更新、服務帳戶重新組態、及資料庫連結詳細資料 - 確認管理介面有支援以角色為主的授權,以區分內容開發人員和操作員或系統管理員。例如,負責更新靜態網站內容的人員不需要被容許改變客戶的信用額度或重設資料庫連結字串。
檢查應用程式如何處理在存放區中、在應用程式記憶體、和當在網路上傳輸時的機密資料。[表 5.5] 顯示最常見的有關處理機密資料的弱點。
[表 5.5] 常見的有關處理機密資料的弱點
| 弱點 | 含意 |
當不需要的時候仍然儲存機密 | 相對於沒有在第一時間內儲存機密,這會大大的增加安全性的風險。 |
儲存程式碼中的機密 | 如果程式碼是在伺服器上,攻擊者可能能夠將其下載。在二進位的組件中機密是看得到的。 |
以純文字儲存機密 | 任何可以登入到伺服器的人就可以看到機密的資料。 |
在網路上以純文字傳送機密資料 | 竊聽者可以監控網路來洩露和竄改資料。 |
使用下列問題來幫助驗證應用程式對機密資料的處理:
| • | 您是否有儲存機密? |
| • | 您如何儲存機密資料? |
| • | 您是否有在網路上傳送機密資料? |
| • | 您是否有記錄機密資料? |
機密包括應用程式組態資料、例如帳戶密碼和加密金鑰。如果可能的話,識別可以不儲存機密的替代設計方案。如果您負責處理機密,盡可能讓平台來處理機密以減輕應用程式的負荷。如果必須儲存機密,請檢閱下列問題:
| • |
您是否可避免儲存機密?
同樣的,如果使用 Windows 驗證,可以使用嵌入憑證避免儲存連結字串。 |
| • |
您如何儲存機密?
|
| • |
您將機密儲存在何處?
如果使用「本機安全性註冊 (LSA)」,程式碼必須執行系統管理員的權限才能擷取機密,因而增加風險。不需要延伸權限的替代方案是使用 DPAPI。 |
| • |
您如何處理機密?
|
| • |
您是否在 Cookie 中儲存機密?
|
如果儲存機密應用程式資料,例如客戶信用卡詳細資料,檢查如何保護資料。
| • | 您使用什麼加密演算法?應該使用有大型金鑰的增強式加密演算法來加密資料,例如 Triple DES。 |
| • | 您如何保障加密金鑰的安全?只有加密金鑰安全時資料才安全,檢查如何保障金鑰的安全。在理想狀況下,使用 DPAPI 來加密金鑰並將其安全的保存於受限制的位置,例如,登錄機碼。 |
如果在網路上傳送機密資料,檢查資料是否有用應用程式來加密或僅在加密的通訊連結上傳送。
檢查應用程式 (或主機) 是否有以純文字的記錄檔案記錄機密資料,例如使用者帳戶密碼。通常應該要避免這樣。確保應用程式沒有在查詢字串中傳送機密資料,因為會被記錄而且在用戶端瀏覽器的位址列中會被清楚地看到。
因為 Web 應用程式是建立在無狀態的 HTTP 通訊協定之上,所以工作階段管理是應用程式層級的責任。檢查應用程式對工作階段管理的方法,因為這直接影響到應用程式整體的安全性。[表 5.6] 顯示最常見的工作階段管理弱點。
[表 5.6] 常見的工作階段管理弱點
| 弱點 | 含意 |
在未加密的通道上傳送工作階段識別元 | 攻擊者可以擷取工作階段識別元進而偽造識別身份。 |
延長工作階段存留期 | 這會增加連線劫持和重新執行攻擊的風險。 |
不安全的工作階段狀態存放區 | 攻擊者可以存取使用者的私人工作階段資料。 |
查詢字串中的工作階段識別元 | 在用戶端的工作階段識別元可被輕易地修改,進而偽造識別身份並假裝為另一使用者來存取應用程式。 |
使用下列問題來幫助驗證應用程式對機密資料的處理:
| • | 工作階段識別元如何進行交換? |
| • | 您是否有限制工作階段的存留期? |
| • | 您如何保障工作階段狀態存放區的安全? |
檢查應用程式用來管理使用者工作階段的工作階段識別元,以及這些工作階段識別元如何進行交換。請考慮下面的狀況:
| • |
您是否有在未加密的通道上傳送工作階段識別元?
|
| • |
您是否有加密工作階段 Cookie?
|
| • |
您是否有在查詢字串中傳送工作階段識別元」?
|
檢查應用程式認為工作階段識別元的有效時間是多久。應用程式應該限制該有效時間以減輕連線劫持和重新執行攻擊的潛在威脅。
檢查應用程式如何儲存工作階段狀態。工作階段狀態可以儲存在 Web 應用程式處理程序、ASP.NET 工作階段狀態服務、或 SQL Server 狀態存放區中。如果使用遠端狀態存放區,確認從 Web 伺服器到遠端存放區之間的連結有使用 IPSec 或 SSL 加密以保護網路連線上的資料。
有關保護 ASP.NET 工作階段狀態的更多詳細資訊,請參閱單元 19<保障 ASP.NET 應用程式及 Web 服務的安全>中的「工作階段狀態」。
如果應用程式使用密碼編譯來提供安全性,檢查為什麼使用以及使用什麼方法。[表 5.7] 顯示最常見的有關密碼編譯的弱點。
[表 5.7] 常見的密碼編譯弱點
| 弱點 | 含意 |
使用自訂密碼編譯 | 這幾乎可以確定比使用平台提供經過嘗試和測試的密碼編譯方法不安全。 |
使用錯誤的演算法或太小的金鑰大小 | 較新的演算法會增加安全性。較大的金鑰大小會增加安全性。 |
無法保障加密金鑰的安全 | 只有在加密金鑰安全時加密的資料才安全。 |
在延長時期使用相同的金鑰 | 在一段時間之後靜態金鑰比較可能被發現。 |
檢閱下列問題來幫助驗證應用程式對機密資料的處理:
| • | 您為何使用特別的演算法? |
| • | 您如何保障加密金鑰的安全? |
只有在正確的使用密碼編譯,以及針對工作用對演算法時,密碼編譯才能提供真正的安全性。演算法的強度也是很重要的。檢閱下列的問題來檢視對加密演算法的使用:
| • |
您是否有開發自己的密碼編譯?
|
| • |
您是否有使用適當金鑰大小的正確演算法?
|
關於選擇正確的演算法和金鑰大小的更多詳細資訊,請參閱單元 4<設計安全 Web 應用程式的指導方針>中的「密碼編譯」章節。
只有在金鑰安全時加密的資料才安全。若要譯解加密的資料,攻擊者必須能夠取得金鑰和密碼文字。因此,檢查設計以確認加密金鑰和加密資料有受到保護。考慮下列的檢閱問題:
| • |
您如何保障加密金鑰的安全?
|
| • |
金鑰多久會回收重複使用?
|
檢查應用程式如何使用參數。這些參數包括在用戶端和伺服器之間傳送的表單欄位、查詢字串、Cookie、HTTP 標頭、和檢視狀態。如果使用參數例如查詢字串來傳送機密資料,例如工作階段識別元,有惡意的用戶端可以使用簡單的參數操作輕易地跳過伺服器端的檢查。[表 5.8] 顯示最常見的參數操作弱點。
[表 5.8] 常見的參數操作弱點
| 弱點 | 含意 |
無法驗證所有的輸入參數 | 應用程式會容易受到拒絕服務攻擊和程式碼注入攻擊的影響,包括 SQL 注入和 XSS。 |
資密資料放在未加密的 Cookie 中 | 用戶端可以改變 Cookie 資料,或者在網路上傳送時 Cookie 資料也會被擷取和改變。 |
機密資料在查詢字串和表單欄位中 | 這在用戶端很容易被變更。 |
信任 HTTP 標頭資訊 | 這在用戶端很容易被變更。 |
未受保護的檢視狀態 | 這在用戶端很容易被變更。 |
檢查下列問題來幫助確認設計不會容易受到參數操作攻擊的影響:
| • | 您是否有驗證所有的輸入參數? |
| • | 您是否有在參數中傳送機密資料? |
| • | 您是否有將 HTTP 標頭資料使用於安全性? |
檢查應用程式是否驗證所有的輸入參數,包括標準和隱藏的表單欄位、查詢字串、及 Cookie。
如果應用程式在參數中傳送機密資料,例如查詢字串或表單欄位,檢查為什麼在許多更安全的傳送工作階段識別元的方法中 (例如,在加密的 Cookie 中),應用程式選用這個方法。使用此資訊將工作階段與維護在伺服器狀態存放區的使用者狀態結合起來。考慮下列的檢閱重點:
| • |
您是否為有機密資料的 Cookie 加密?
|
| • |
您是否有在查詢字串或表單欄位中傳送機密資料?
|
| • |
您是否有保護檢視狀態?
|
確認 Web 應用程式沒有根據 HTTP 標頭中的資訊來做安全性決定,因為攻擊者可以輕易地操作標頭。不要依賴 HTTP「參照者 (referer)」欄位的值來檢查要求是否源自您的 Web 伺服器所產生的網頁 - 這會產生弱點。這樣做原本就不安全,因為用戶端可以輕易地變更「參照者 (referer)」欄位。
檢查應用程式處理錯誤狀況的方法。建議一致地使用結構化的例外處理。同樣的,檢查在例外發生時應用程式沒有洩露太多資訊。[表 5.9] 顯示兩個主要的例外管理弱點。
[表 5.9] 常見的例外管理弱點
| 弱點 | 含意 |
無法使用結構化的例外處理 | 應用程式更容易受到拒絕服務攻擊和邏輯瑕疵的影響,而暴露出安全性弱點。 |
洩露太多資訊給用戶端 | 攻擊者可以使用這些資訊來幫助計劃以及調整後續的攻擊。 |
檢閱下列問題來幫助確認設計不會容易受到例外管理安全性弱點的影響:
| • | 您是否有使用結構化的例外處理? |
| • | 您是否有洩露太多資訊給用戶端? |
檢查應用程式如何使用結構化的例外處理。在設計上應該命令整個應用程式從頭到尾一致地使用結構化的例外處理。這會建立更強大的應用程式,而且應用程式比較不會被遺留在不一致的狀態而洩露出安全性弱點。
確認惡意使用者不能利用錯誤訊息中包含的過度詳細資訊。檢閱下列各點:
| • |
您是否有在伺服器上捕捉、處理、和記錄例外?
|
| • |
您是否有使用集中式的例外管理系統?
|
| • |
您是否有定義一組自訂錯誤訊息?
有關設計及實作 .NET 應用程式的例外管理架構,請參閱 MSDN 文章,《Exception Management Architecture Guide (英文)》網址為:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/exceptdotnet.asp。 |
檢查應用程式如何使用稽核和記錄。除了預防否認的問題,定期分析記錄檔案可以幫助識別入侵的徵兆。[表 5.10] 顯示最常見的稽核和記錄弱點。
[表 5.10] 常見的稽核和記錄弱點
| 弱點 | 含意 |
無法稽核失敗的登入 | 嘗試非法侵入沒有被發現。 |
無法保障稽核檔案的安全 | 攻擊者可以掩蓋形跡。 |
無法跨不同應用程式層進行稽核 | 否認的潛在威脅增加。 |
檢閱下列問題來幫助驗證應用程式稽核和記錄的方法:
| • | 您是否有對識別金鑰活動進行稽核? |
| • | 您是否有考慮如何保留原始呼叫者識別身份? |
| • | 您是否有考慮安全的記錄檔案管理原則? |
設計上應該定義哪些活動需要被稽核。請考慮下面的狀況:
| • |
您是否有稽核失敗的登入嘗試?
|
| • |
您是否有稽核其他的金鑰作業?
|
設計上應該確認跨不同應用程式層的活動有被稽核。若要如此做,原始呼叫者的識別身份必須在每一層都有效。
| • |
您是否有跨不同應用程式層進行稽核?
|
| • |
您如何同步處理多個記錄?
|
| • |
您如何保留原始呼叫者識別身份?
同樣的,如果多個使用者對應到同一個應用程式角色,檢查應用程式有記錄原始呼叫者的識別身份。 |
檢查應用程式設計是否分析出記錄檔案如何備份、保存、和分析。記錄檔案應該定期備份以確保不會被填滿或開始循環,而且應該定期分析以偵查入侵的徵兆。同樣請確認使用最小權限帳戶執行備份,而且對純粹因為備份目的而暴露的任何其他通訊通道有加以保護。
經由花費時間和努力來分析及檢閱應用程式架構及設計,可以消弭設計相關的弱點進而增強整體安全性。在設計時期修補弱點比稍後在開發週期才進行修補容易的多而且成本較低。
經由考慮設計相關的目標部署環境以及環境所定義的安全性原則,可以幫助確保順利與安全的應用程式部署。
如果已經有建立應用程式,架構及設計檢閱仍然是安全性評估程序的重要部分,有助於修補弱點及增強未來的設計。
有關其他詳細資訊,請參閱下列資源:
| • | 如需設計、建置及設定驗證、授權及在分散式 Web 應用程式各層間安全通訊的詳細資料,請參閱《建置安全的 ASP.NET 應用程式: 驗證、授權和安全通訊》網址為:http://www.microsoft.com/taiwan/msdn/books/ataglance/secnetlpMSDN.htm>。 |
| • | 如需可列印的檢查清單,請參閱本指南<檢查清單>章節中的<檢查清單:架構及設計檢閱>。 |