XAML セキュリティの考慮事項

このトピックでは、XAML および .NET Framework XAML サービス API を使用するときの、アプリケーションのセキュリティのベスト プラクティスについて説明します。

アプリケーションの信頼されていない XAML

最も一般的な意味では、信頼されていない XAML とは、アプリケーションで明確に含めたり生成したりしていない XAML ソースを指します。

信頼された署名済みアセンブリ内に resx 型のリソースとしてコンパイルまたは格納されている XAML は、本質的には信頼されていない XAML ではありません。 XAML は、アセンブリ全体と同程度に信頼することができます。 ほとんどの場合は、Loose XAML の信頼の側面のみを考慮します。Loose XAML とは、ストリームやその他の IO から読み込む XAML ソースのことです。 Loose XAML は、配置およびパッケージング インフラストラクチャを持つアプリケーション モデルの特定のコンポーネントや機能ではありません。 ただし、アセンブリは Loose XAML の読み込みを伴う動作を実装することがあります。

信頼されていない XAML は、一般的には、信頼されていないコードと同じように扱う必要があります。 信頼されていない可能性がある XAML が、信頼されているコードにアクセスしないよう、サンドボックス化またはその他の比喩を使用します。

XAML 機能は、性質上、オブジェクトを構築し、プロパティを設定する権利を XAML に与えます。 これらの機能には、型コンバーターへのアクセス、アプリケーション ドメインのアセンブリのマッピングとアクセス、マークアップ拡張機能の使用、x:Code ブロックなども含まれます。

言語レベルの機能に加えて、XAML は、さまざまな技術の UI の定義で使用されています。 信頼されていない XAML を読み込むと、悪意のあるなりすまし UI を読み込む可能性もあります。

リーダーおよびライターによるコンテキストの共有

XAML リーダーおよび XAML ライターの .NET Framework XAML サービス アーキテクチャでは、XAML ライターまたは XAML スキーマ コンテキストに XAML リーダーを共有する必要があります。 XAML ノード ループ ロジックを記述している場合、またはカスタム保存パスを指定する場合には、オブジェクトまたはコンテキストの共有が必要になることがあります。 信頼されているコードと信頼されていないコードの間で、XAML リーダー インスタンス、既定以外の XAML スキーマ コンテキスト、または XAML リーダー/XAML ライター クラスの設定を共有しないでください。

CLR ベースの型バッキング向けの、XAML オブジェクトの記述を伴う大半のシナリオおよび操作では、既定の XAML スキーマ コンテキストのみを使用できます。 既定の XAML スキーマ コンテキストには、完全な信頼を損なう可能性がある設定は明示的には含まれていません。 そのため、信頼されている XAML リーダー/ライター コンポーネントと、信頼されていない XAML リーダー/ライター コンポーネントの間でコンテキストを共有しても安全です。 ただし、そうする場合は、そのようなリーダーとライターを個別の AppDomain スコープに保持しておき、いずれか 1 つを部分信頼用に指定/サンドボックス化することをお勧めします。

XAML 名前空間およびアセンブリの信頼

XAML がアセンブリに対するカスタム XAML 名前空間マッピングをどのように解釈するかについての基本的な非修飾構文および定義では、アプリケーション ドメインに読み込まれた、信頼されたアセンブリと信頼されていないアセンブリを区別しません。 そのため、理論的には、信頼されていないアセンブリが信頼されているアセンブリが目的とする XAML 名前空間マッピングになりすまし、XAML ソースの宣言されたオブジェクトおよびプロパティ情報をキャプチャすることはできます。 この状況を回避するためのセキュリティ要件がある場合は、目的の XAML 名前空間マッピングは、次のいずれかの方法によって行われる必要があります。

  • アプリケーションの XAML によって作成されたすべての XAML 名前空間マッピングで、厳密な名前を持つ完全修飾アセンブリ名を使用する。

  • XAML リーダーおよび XAML オブジェクト ライターに対して特定の XamlSchemaContext を構築し、アセンブリ マッピングを参照アセンブリの固定セットに制限する。 「XamlSchemaContext(IEnumerable<Assembly>)」を参照してください。

XAML 型マッピングと型システム アクセス

XAML は独自の型システムをサポートしています。この型システムは、CLR が基本的な CLR 型システムを実装する方法と、多くの点で似ています。 ただし、型情報に基づいて型に関する信頼の決定を下すという、型対応の一部の側面では、CLR バッキング型の型情報に従う必要があります。 これは、XAML 型システム固有の一部のレポート機能は仮想メソッドとして開いたままになるため、元の .NET Framework XAML サービス実装の完全な制御下にはないためです。 これらの機能拡張ポイントが存在するのは、既定の CLR バッキング実装および既定の XAML スキーマ コンテキストに比べ、XAML 型システムには XAML 自体の拡張性と、使用できる型マッピング戦略に対応するだけの拡張性があるためです。 詳細については、XamlType および XamlMember のいくつかのプロパティに関するメモを参照してください。

参照

参照

XamlAccessLevel