XAML 安全性考慮

本文說明當您使用 XAML 和 .NET XAML 服務 API 時,應用程式中安全性的最佳做法。

應用程式中不受信任的 XAML

從最普遍意義上說,不受信任的 XAML 是您的應用程式未特別包含或發出的任何 XAML 來源。

編譯成或儲存為 resx 受信任和已簽署元件內之 -type 資源的 XAML 原本就不是不受信任的。 您可以像信任整個元件一樣信任 XAML。 在大部分情況下,您只關心鬆散 XAML 的信任層面,這是您從資料流程或其他 I/O 載入的 XAML 來源。 鬆散的 XAML 不是具有部署和封裝基礎結構的應用程式模型特定元件或功能。 不過,元件可能會實作涉及載入鬆散 XAML 的行為。

針對不受信任的 XAML,您應該將它一般視為不受信任的程式碼。 使用沙箱或其他隱喻來防止可能不受信任的 XAML 存取信任的程式碼。

XAML 功能的本質讓 XAML 有權建構物件並設定其屬性。 這些功能也包括存取類型轉換器、使用標記延伸模組、 x:Code 區塊等在應用程式域中對應和存取元件。

除了語言層級功能之外,XAML 還用於許多技術的 UI 定義。 載入不受信任的 XAML 可能表示載入惡意詐騙 UI。

在讀者與寫入器之間共用內容

XAML 讀取器和 XAML 寫入器的 .NET XAML 服務架構通常需要將 XAML 讀取器共用至 XAML 寫入器或共用的 XAML 架構內容。 如果您要撰寫 XAML 節點迴圈邏輯,或提供自訂儲存路徑,可能需要共用物件或內容。 請勿在受信任和不受信任的程式碼之間共用 XAML 讀取器實例、非預設的 XAML 架構內容,或 XAML 讀取器/寫入器類別的設定。

大部分涉及針對 CLR 型類型支援撰寫 XAML 物件的案例和作業,都只能使用預設的 XAML 架構內容。 預設的 XAML 架構內容不會明確包含可能會危害完全信任的設定。 因此,在受信任和不受信任的 XAML 讀取器/寫入器元件之間共用內容是安全的。 不過,如果您這樣做,將這類讀取器和寫入器保留在不同的 AppDomain 範圍中仍然是最佳做法,其中一個特別針對部分信任進行預定/沙箱化。

XAML 命名空間和元件信任

XAML 如何解譯自訂 XAML 命名空間對應至元件的基本不限定語法和定義,不會區分載入至應用程式域的受信任和不受信任的元件。 因此,在技術上,不受信任的元件可能會詐騙受信任元件的預定 XAML 命名空間對應,並擷取 XAML 來源的宣告物件和屬性資訊。 如果您有可避免這種情況的安全性需求,應該使用下列其中一種技術來對應您預期的 XAML 命名空間對應:

  • 在應用程式 XAML 所建立的任何 XAML 命名空間對應中,使用具有強式名稱的完整元件名稱。

  • 藉由建構 XAML 讀取器和 XAML 物件寫入器的特定 XamlSchemaContext ,限制元件對應到固定的參考元件集。 請參閱 XamlSchemaContext(IEnumerable<Assembly>)

XAML 類型對應和類型系統存取

XAML 支援自己的類型系統,其在許多方面都是 CLR 如何實作基本 CLR 類型系統的對等。 不過,對於類型感知的某些層面,您會根據類型資訊對類型做出信任決策,您應該延遲 CLR 支援類型中的類型資訊。 這是因為 XAML 類型系統的一些特定報告功能會保持開啟作為虛擬方法,因此不會完全受原始 .NET XAML 服務實作的控制。 這些擴充點存在,因為 XAML 類型系統是可延伸的,以符合 XAML 本身的擴充性及其可能的替代類型對應策略,與預設 CLR 支援的實作和預設 XAML 架構內容。 如需詳細資訊,請參閱 和 XamlMember 之數個屬性 XamlType 的特定附注。

另請參閱