Share via


程式碼存取安全性中的變更摘要

在 .NET Framework 4 版中,程式碼存取安全性 (CAS) 經歷了重大變更,其目的在於簡化安全性系統。 在舊版 .NET Framework 中,Managed 應用程式的權限是由安全性原則規則所決定,這些規則是對全電腦設定,以建立執行階段設定。 從 .NET Framework 4 開始:

  • 安全性原則不再生效。 權限仍會使用,只有消除原則系統。

  • 應用程式的存取權限是由兩項因素決定:使用權限 (由應用程式定義域建立的授與集) 和透明度。 所有部分信任應用程式都會分類為透明。 透明的應用程式不必考慮安全性。 透明度率先用於 Microsoft Silverlight,現已擴充至所有裝載環境。

  • 對於桌面和近端內部網路應用程式都會授與完全信任。

重要事項重要事項

對於 CAS 的主要變更在於消除安全性原則。CAS 本身並未消除,只是取消使用原則 (以及部分權限要求)。

本主題提供 .NET Framework 4 中 CAS 變更的簡短概觀。 如需詳細資訊,請參閱 .NET Framework 4 中的安全性變更

使用沙箱和權限模型

下列清單描述 .NET Framework 4 中桌面和裝載應用程式的信任模型。 如需詳細資訊,請參閱 .NET Framework 4 中的安全性變更

  • 桌面應用程式。 就如同舊版 .NET Framework,對於位於桌面上的 Managed 應用程式 (除非已從 Web 下載) 會授與完全信任。 對於位在近端內部網路之共用上的應用程式也會授與完全信任。 您可以不需再使用原則,以本機硬碟上應用程式所屬的資料夾為基礎來限制其權限。

  • 裝載應用程式。 對於在沙箱中執行的應用程式 (例如 Silverlight 架構的應用程式) 會授與一組有限的權限,決定這些應用程式可以存取的電腦資源 (例如,應用程式可以存取哪些檔案)。 沙箱提供了將沙箱內的某些組件識別為部分信任,以及將某些組件識別為完全信任的能力。 對部分信任組件會授與一組特定的權限,如建立沙箱的應用程式定義域 (System.AppDomain) 所決定。 部分信任程式碼可以呼叫完全信任程式庫中的部分完全信任程式碼。 該受信任的程式碼可以呼叫電腦上受保護的資源。 不過,若要公開存取能夠呼叫受保護資源的完全信任型別和成員,必須經過安全性稽核。 這些成員會分類成安全關鍵,如下一節中所述。 它們可以由部分信任 (透明) 程式碼呼叫,接著它們就可以呼叫關鍵程式碼。

安全性透明度

安全性透明度會將對安全性敏感的程式碼和對安全性不敏感的程式碼分開。 將它導入 .NET Framework 2.0 版 中,可藉由將必須執行安全性敏感動作的程式碼加註為安全性關鍵,讓安全性稽核更簡單。 這表示,任何不是安全性關鍵的程式碼都不需要徹底檢閱。 不過,在這些舊版 .NET Framework 中,只有 Microsoft 程式碼使用透明度。

在 .NET Framework 4 中,這個模型已擴充而且規則更嚴謹,進一步將安全性透明度變成強制模型。 在這個增強的模型中,對安全性敏感且可由部分信任應用程式呼叫的程式碼更容易識別。 如此便進一步減少必須稽核的介面區。

下表說明為程式碼加註的透明度分類和相關聯的屬性。

安全性分類

屬性

描述

透明

SecurityTransparentAttribute

未執行任何原本就是安全性敏感作業的程式碼。

關鍵

SecurityCriticalAttribute

可以執行任何作業,但是無法從部分信任應用程式呼叫的程式碼。

安全關鍵

SecuritySafeCriticalAttribute

可以執行任何作業,而且可以從部分信任應用程式呼叫的程式碼。 這是安全 Broker 層,其目的是在呼叫關鍵程式碼之前執行適當的安全性檢查和驗證。

無論授與的權限為何,透明程式碼都無法執行下列作業:

  • 包含無法驗證的程式碼。

  • 使用平台叫用

  • 執行 Assert 作業。

  • 呼叫關鍵程式碼。

  • 衍生自關鍵程式碼。

  • 呼叫受 LinkDemand 保護的程式碼 (也就是視為關鍵的程式碼)。

如果您的程式碼嘗試違反這些規則,則會擲回例外狀況 (即使程式碼擁有完全信任)。 如需詳細資訊,請參閱 .NET Framework 4 中的安全性變更

請注意,安全性敏感度是在 Common Language Runtime (CLR) 中定義,如同針對透明程式碼禁止的動作。 透明度模型不會防止特定情況的安全性違規,例如將密碼儲存在欄位中。

安全性模型的運作方式

  • 每一個 AppDomain 都有相關聯的權限集合,該權限集合是由裝載案例中的主機所定義 (未裝載之程式碼的權限集合是完全信任)。

  • 部分信任程式碼一定是透明的,因此無法執行針對透明程式碼禁止的動作 (請參閱透明度)。

  • 根據預設,除非已標記為透明,否則完全信任程式碼是關鍵程式碼。 如果桌面應用程式標記為透明,即使擁有完全信任,也無法呼叫關鍵程式碼。

  • 主機和 .NET Framework 都可對部分信任程式碼公開程式庫。 這些程式庫包含混合的透明、關鍵和安全關鍵程式碼。

  • 安全關鍵程式碼必須要求適當的權限,才能使用關鍵功能。 例如,File.Open 方法會在開啟檔案之前要求 FileIOPermission

  • 安全關鍵程式碼也必須在呼叫關鍵功能之前和之後,執行任何其他檢查和驗證。 例如,例外狀況和訊息可能必須經過篩選,才能傳遞至部分信任程式碼。

  • 部分信任程式碼呼叫關鍵程式碼時,關鍵程式碼必須判斷提示需要的權限,因為它可能正在執行不允許部分信任程式碼執行的作業。

請參閱

概念

.NET Framework 4 中的安全性變更

安全性透明的程式碼