安全性透明的程式碼

安全性包含三個互動片段:沙箱化、使用權限和強制執行。 沙箱化是指建立隔離定義域的作法,以便將某些程式碼視為完全信任,而將其他程式碼限制為沙箱授權集中的使用權限。 在沙箱授權集內部執行的應用程式程式碼會被視為透明的。也就是說,它無法執行任何可能會影響安全性的作業。 沙箱授權集是依照辨識項決定的。 辨識項會識別沙箱所需的特定使用權限,以及可建立的沙箱種類。 強制執行是指讓透明程式碼只能在其授權集內部執行。

重要事項重要事項

安全性原則是舊版 .NET Framework 中的重要項目。不過,從 .NET Framework 4 版開始,安全性原則就已過時。安全性原則的排除與安全性透明度不同。如需這項變更之影響以及降低建議的詳細資訊,請參閱程式碼存取安全性原則相容性和移轉

本主題將詳細描述透明度模型。 它包含以下各節:

  • 透明度模型的用途

  • 指定透明度層級

  • 透明度強制執行

透明度模型的用途

透明度是一種強制執行機制,可分隔當做應用程式一部分執行的程式碼與當做基礎結構一部分執行的程式碼。 透明度在可以執行授權事項 (例如呼叫機器碼) 的程式碼 (關鍵程式碼) 和不能執行授權事項的程式碼 (透明程式碼) 之間畫出了一條界線。 透明程式碼可以在其運作範圍的使用權限集合界限內執行命令,但是無法執行、衍生自或包含關鍵程式碼。

透明度強制執行的主要目標就是提供一種簡單且有效的機制,以便根據權限隔離不同的程式碼群組。 在沙箱化模型的內容中,這些權限群組為完全信任 (亦即,不受限制) 或部分信任 (亦即,限制為授與沙箱的使用權限集合)。

重要事項重要事項

透明度模型超越了程式碼存取安全性。透明度是由 Just-In-Time 編譯器強制執行,而且維持有效狀態,不論組件的授權集為何,包括完全信任。

透明度是 .NET Framework 2.0 版引入的,可簡化安全性模型,並且讓您更輕鬆地撰寫和部署安全程式庫與應用程式。 Microsoft Silverlight 也使用了透明程式碼,以便簡化部分信任應用程式的開發作業。

注意事項注意事項

當您開發部分信任應用程式時,必須注意目標主機的使用權限需求。您可以開發使用某些主機不允許之資源的應用程式。雖然這種應用程式在編譯時不會發生任何錯誤,不過當它載入裝載環境時,就會失敗。如果您已經使用 Visual Studio 開發了應用程式,就可以在開發環境中以部分信任或受限制的使用權限集合啟用偵錯。如需詳細資訊,請參閱 HOW TO:以限制使用權限偵錯 ClickOnce 應用程式。針對 ClickOnce 應用程式所提供的「計算使用權限」功能也適用於任何部分信任應用程式。

回到頁首

指定透明度層級

組件層級 SecurityRulesAttribute 屬性會明確選取組件所遵循的 SecurityRuleSet 規則。 這些規則會在數值層級系統底下組織,其中較高的層級表示會比較嚴格強制執行安全性規則。

這些層級如下所示:

  • 層級 2 (Level2) – .NET Framework 4 透明度規則。

  • 層級 1 (Level1) – .NET Framework 2.0 透明度規則。

這兩個透明度層級之間的主要差異在於,層級 1 不會針對組件外部的呼叫強制執行透明度規則,只適用於相容性。

重要事項重要事項

您應該僅針對相容性指定層級 1 透明度。也就是說,您應該僅針對使用 .NET Framework 3.5 或舊版所開發而且使用 AllowPartiallyTrustedCallersAttribute 屬性或沒有使用透明度模型的程式碼指定層級 1。例如,若為允許來自部分信任呼叫端 (APTCA) 之呼叫的 .NET Framework 2.0 組件,請使用層級 1 透明度。若為針對 .NET Framework 4 所開發的程式碼,請一律使用層級 2 透明度。

層級 2 透明度

層級 2 透明度是 .NET Framework 4 版引入的。 這個模型的三個原則是透明程式碼、安全性安全關鍵程式碼和安全性關鍵程式碼。

  • 透明程式碼只能呼叫其他透明程式碼或安全性安全關鍵程式碼,不論它被授與的使用權限為何 (包括完全信任)。 如果此程式碼受到部分信任,它就只能執行定義域之使用權限集合所允許的動作。 透明程式碼無法進行下列作業:

    此外,透明方法無法覆寫關鍵虛擬方法或實作關鍵介面方法。

  • 安全性安全關鍵程式碼受到完全信任,但是可由透明程式碼呼叫。 它會公開完全信任程式碼的有限介面區。 正確性和安全性驗證會在安全關鍵程式碼中進行。

  • 雖然安全性關鍵程式碼可以呼叫任何程式碼而且受到完全信任,但是無法由透明程式碼呼叫。

層級 1 透明度

層級 1 透明度模型是 .NET Framework 2.0 版引入的,可讓開發人員減少受限於安全性稽核的程式碼數量。 雖然層級 1 透明度可公開使用於 2.0 版中,不過它主要是針對安全性稽核目的使用於 Microsoft 中。 開發人員可以透過附註宣告哪些型別和成員可以提高安全性和執行其他受信任動作 (安全性關鍵),以及哪些型別和成員無法執行這些作業 (安全性透明)。 識別為透明程式碼的程式碼不需要高度安全性稽核。 層級 1 透明度表示透明度強制執行限制為組件內部。 換言之,識別為安全性關鍵的任何公用型別或成員只在組件內部成為安全性關鍵的。 從組件外部呼叫這些型別和成員時,如果您想要針對它們強制執行安全性,就必須使用完全信任的連結要求。 如果您沒有這樣做,公開可見的安全性關鍵型別和成員就會被視為安全性安全關鍵的,而且可由組件外部的部分信任程式碼呼叫。

層級 1 透明度模型具有下列限制:

  • 公用的安全性關鍵型別和成員可從安全性透明程式碼存取。

  • 透明度附註只在組件內部強制執行。

  • 安全性關鍵型別和成員必須使用連結要求,針對來自組件外部的呼叫強制執行安全性。

  • 繼承規則不會強制執行。

  • 在完全信任中執行時,透明程式碼進行有害事項的可能性就會存在。

回到頁首

透明度強制執行

透明度規則會等到計算出透明度之後才強制執行。 此時,如果違反了透明度規則,就會擲回 InvalidOperationException。 計算透明度的時間取決於多個因素,而且無法預測。 系統會盡可能延後計算透明度。 在 .NET Framework 4 中,組件層級透明度計算會比 .NET Framework 2.0 更早進行。唯一確定的是,透明度計算會等到需要時才進行。 這與 Just-In-Time (JIT) 編譯器如何變更編譯方法和偵測方法中之任何錯誤的時間點很相似。 如果您的程式碼沒有任何透明度錯誤,透明度計算就是不可見的。

回到頁首

請參閱

概念

安全性透明的程式碼,層級 1

安全性透明的程式碼,層級 2