WPF 部分信頼セキュリティ
一般に、インターネット アプリケーションは、悪意のある損害を防ぐために、重要なシステム リソースへの直接アクセスを制限する必要があります。 既定では、HTML およびクライアント側のスクリプト言語は重要なシステム リソースにアクセスできません。 Windows Presentation Foundation (WPF) ブラウザーでホストされるアプリケーションはブラウザーから起動できるため、同様の一連の制限に準拠する必要があります。 これらの制限を適用するために、WPF はコード アクセス セキュリティ (CAS) と ClickOnce の両方に依存します (「WPF セキュリティ戦略 - プラットフォーム セキュリティ
WPF では、可能な限り多くの機能を部分信頼で安全に使用できるようにさまざまなサポートが提供され、CAS と共に、部分信頼プログラミングの追加サポートが提供されます。
このトピックには、次のセクションが含まれています。
WPF 機能の部分信頼サポート
次の表に、インターネット ゾーンのアクセス許可セットの制限内で安全に使用できる Windows Presentation Foundation (WPF) の高度な機能を示します。
表 1: 部分信頼で安全な WPF 機能
機能領域 | 特徴 |
---|---|
全般 | ブラウザー ウィンドウ サイトオブオリジンアクセス IsolatedStorage (512 KB の制限) UIAutomation プロバイダー 指揮 入力メソッド エディター (IME) タブレット スタイラスとインク マウス キャプチャと移動イベントを使用したシミュレートされたドラッグ アンド ドロップ OpenFileDialog XAML 逆シリアル化 (XamlReader.Load 経由) |
Web 統合 | ブラウザーのダウンロード ダイアログ Top-Level User-Initiated ナビゲーション mailto:メールリンク 統一リソース識別子 パラメーター HTTPWebRequest IFRAME でホストされる WPF コンテンツ フレームを使用した Same-Site HTML ページのホスティング WebBrowser を使用した同じサイト HTML ページのホスティング Web サービス (ASMX) Web サービス (Windows Communication Foundation を使用) スクリプト ドキュメント オブジェクト モデル |
ビジュアル | 2D と 3D アニメーション メディア (サイトオブオリジンとクロスドメイン) イメージング/オーディオ/ビデオ |
読書 | フロードキュメント XPS ドキュメント 埋め込みシステムフォント & CFF & TrueType フォント |
編集 | スペル チェック リッチテキストボックス プレーンテキストとインク クリップボードのサポート User-Initiated 貼り付け 選択したコンテンツのコピー |
コントロール | 一般的なコントロール |
この表では、WPF の機能について大まかに説明します。 詳細については、Windows SDK は WPF の各メンバーに必要なアクセス許可を文書化します。 さらに、次の機能には、特別な考慮事項など、部分信頼の実行に関するより詳細な情報があります。
XAML (WPF
XAML を参照)。 ポップアップ (System.Windows.Controls.Primitives.Popupを参照)。
ドラッグ アンド ドロップ (ドラッグ アンド ドロップの概要
参照)。 クリップボード (System.Windows.Clipboardを参照)。
イメージング (System.Windows.Controls.Imageを参照)。
シリアル化 (XamlReader.Load、XamlWriter.Saveを参照)。
[ファイルを開く] ダイアログ ボックス (Microsoft.Win32.OpenFileDialogを参照)。
次の表は、インターネット ゾーンのアクセス許可セットの制限内で安全に実行できない WPF 機能の概要を示しています。
表 2: 部分信頼で安全ではない WPF 機能
機能領域 | 特徴 |
---|---|
全般 | ウィンドウ (アプリケーション定義ウィンドウとダイアログ ボックス) ファイル保存ダイアログ ファイル システム レジストリ アクセス ドラッグ アンド ドロップ XAML シリアル化 (XamlWriter.Save 経由) UIAutomation クライアント ソース ウィンドウ アクセス (HwndHost) 完全な音声のサポート Windows フォームの相互運用性 |
ビジュアル | ビットマップ効果 画像エンコード |
編集 | リッチ テキスト形式のクリップボード XAML の完全なサポート |
部分信頼プログラミング
XBAP アプリケーションの場合、既定のアクセス許可セットを超えるコードの動作は、セキュリティ ゾーンによって異なります。 場合によっては、ユーザーがインストールしようとすると警告が表示されます。 ユーザーは、インストールの続行またはキャンセルを選択できます。 次の表では、各セキュリティ ゾーンのアプリケーションの動作と、アプリケーションが完全な信頼を受け取るために必要な操作について説明します。
警告
XBAP では、Internet Explorer や古いバージョンの Firefox など、従来のブラウザーが動作する必要があります。 これらの古いブラウザーは、通常、Windows 10 および Windows 11 ではサポートされていません。 最新のブラウザーでは、セキュリティ リスクのために XBAP アプリに必要なテクノロジがサポートされなくなりました。 XBAP を有効にするプラグインはサポートされなくなりました。 詳細については、「WPF ブラウザーでホストされるアプリケーション (XBAP)についてよく寄せられる質問を参照してください。
セキュリティ ゾーン | 行動 | 完全信頼の取得 |
---|---|---|
ローカル コンピューター | 自動完全信頼 | アクションは必要ありません。 |
イントラネットサイトと信頼済みサイト | 完全な信頼を要求するプロンプト | ユーザーがプロンプトにソースを表示できるように、証明書を使用して XBAP に署名します。 |
インターネット | "信頼が付与されていません" で失敗する | 証明書を使用して XBAP に署名します。 |
手記
前の表で説明した動作は、ClickOnce 信頼済み配置モデルに従わない完全信頼 XBAP に対する動作です。
一般に、許可されたアクセス許可を超える可能性のあるコードは、スタンドアロンアプリケーションとブラウザーホスト型アプリケーションの両方で共有される一般的なコードである可能性があります。 CAS と WPF には、このシナリオを管理するためのいくつかの手法が用意されています。
CAS を使用したアクセス許可の検出
場合によっては、ライブラリ アセンブリ内の共有コードをスタンドアロン アプリケーションと XBAP の両方で使用できます。 このような場合、コードは、アプリケーションの付与されたアクセス許可セットで許可されているよりも多くのアクセス許可を必要とする可能性がある機能を実行することがあります。 アプリケーションは、Microsoft .NET Framework セキュリティを使用して、特定のアクセス許可を持っているかどうかを検出できます。 具体的には、目的のアクセス許可のインスタンスで Demand メソッドを呼び出すことによって、特定のアクセス許可があるかどうかをテストできます。 次の例では、ファイルをローカル ディスクに保存できるかどうかを照会するコードを示します。
using System.IO;
using System.IO.IsolatedStorage;
using System.Security;
using System.Security.Permissions;
using System.Windows;
namespace SDKSample
{
public class FileHandling
{
public void Save()
{
if (IsPermissionGranted(new FileIOPermission(FileIOPermissionAccess.Write, @"c:\newfile.txt")))
{
// Write to local disk
using (FileStream stream = File.Create(@"c:\newfile.txt"))
using (StreamWriter writer = new StreamWriter(stream))
{
writer.WriteLine("I can write to local disk.");
}
}
else
{
MessageBox.Show("I can't write to local disk.");
}
}
// Detect whether or not this application has the requested permission
bool IsPermissionGranted(CodeAccessPermission requestedPermission)
{
try
{
// Try and get this permission
requestedPermission.Demand();
return true;
}
catch
{
return false;
}
}
Imports System.IO
Imports System.IO.IsolatedStorage
Imports System.Security
Imports System.Security.Permissions
Imports System.Windows
Namespace SDKSample
Public Class FileHandling
Public Sub Save()
If IsPermissionGranted(New FileIOPermission(FileIOPermissionAccess.Write, "c:\newfile.txt")) Then
' Write to local disk
Using stream As FileStream = File.Create("c:\newfile.txt")
Using writer As New StreamWriter(stream)
writer.WriteLine("I can write to local disk.")
End Using
End Using
Else
MessageBox.Show("I can't write to local disk.")
End If
End Sub
' Detect whether or not this application has the requested permission
Private Function IsPermissionGranted(ByVal requestedPermission As CodeAccessPermission) As Boolean
Try
' Try and get this permission
requestedPermission.Demand()
Return True
Catch
Return False
End Try
End Function
}
}
End Class
End Namespace
アプリケーションに望ましい権限がない場合、Demand の呼び出しによってセキュリティ例外がスローされます。 それ以外の場合は、アクセス許可が付与されています。 IsPermissionGranted
は、この動作をカプセル化し、必要に応じて true
または false
を返します。
機能の正常な低下
コードに必要な操作を行うアクセス許可があるかどうかを検出できることは、異なるゾーンから実行できるコードにとって興味深いものです。 ゾーンを検出することは 1 つのことですが、可能であれば、ユーザーに代わりの手段を提供することをお勧めします。 たとえば、完全信頼アプリケーションでは通常、ユーザーは任意の場所でファイルを作成できますが、部分信頼アプリケーションでは分離ストレージ内にのみファイルを作成できます。 ファイルを作成するコードが、完全信頼 (スタンドアロン) アプリケーションと部分信頼 (ブラウザー ホスト型) アプリケーションの両方で共有されるアセンブリに存在し、両方のアプリケーションでユーザーがファイルを作成できるようにする場合、共有コードは、ファイルを適切な場所に作成する前に、ファイルが部分的または完全な信頼で実行されているかどうかを検出する必要があります。 次のコードは、両方を示しています。
using System.IO;
using System.IO.IsolatedStorage;
using System.Security;
using System.Security.Permissions;
using System.Windows;
namespace SDKSample
{
public class FileHandlingGraceful
{
public void Save()
{
if (IsPermissionGranted(new FileIOPermission(FileIOPermissionAccess.Write, @"c:\newfile.txt")))
{
// Write to local disk
using (FileStream stream = File.Create(@"c:\newfile.txt"))
using (StreamWriter writer = new StreamWriter(stream))
{
writer.WriteLine("I can write to local disk.");
}
}
else
{
// Persist application-scope property to
// isolated storage
IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication();
using (IsolatedStorageFileStream stream =
new IsolatedStorageFileStream("newfile.txt", FileMode.Create, storage))
using (StreamWriter writer = new StreamWriter(stream))
{
writer.WriteLine("I can write to Isolated Storage");
}
}
}
// Detect whether or not this application has the requested permission
bool IsPermissionGranted(CodeAccessPermission requestedPermission)
{
try
{
// Try and get this permission
requestedPermission.Demand();
return true;
}
catch
{
return false;
}
}
Imports System.IO
Imports System.IO.IsolatedStorage
Imports System.Security
Imports System.Security.Permissions
Imports System.Windows
Namespace SDKSample
Public Class FileHandlingGraceful
Public Sub Save()
If IsPermissionGranted(New FileIOPermission(FileIOPermissionAccess.Write, "c:\newfile.txt")) Then
' Write to local disk
Using stream As FileStream = File.Create("c:\newfile.txt")
Using writer As New StreamWriter(stream)
writer.WriteLine("I can write to local disk.")
End Using
End Using
Else
' Persist application-scope property to
' isolated storage
Dim storage As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication()
Using stream As New IsolatedStorageFileStream("newfile.txt", FileMode.Create, storage)
Using writer As New StreamWriter(stream)
writer.WriteLine("I can write to Isolated Storage")
End Using
End Using
End If
End Sub
' Detect whether or not this application has the requested permission
Private Function IsPermissionGranted(ByVal requestedPermission As CodeAccessPermission) As Boolean
Try
' Try and get this permission
requestedPermission.Demand()
Return True
Catch
Return False
End Try
End Function
}
}
End Class
End Namespace
多くの場合、部分信頼の代替手段を見つけることができるはずです。
イントラネットなどの制御された環境では、カスタム マネージド フレームワークをクライアント ベース全体でグローバル アセンブリ キャッシュ (GAC) にインストールできます。 これらのライブラリは、完全な信頼を必要とするコードを実行でき、AllowPartiallyTrustedCallersAttribute を使用して部分的な信頼のみを許可されるアプリケーションから参照できます (詳細については、「セキュリティ と WPF セキュリティ戦略 - プラットフォーム セキュリティ」を参照してください)。
ブラウザー ホストの検出
CAS を使用してアクセス許可を確認することは、アクセス許可ごとに確認する必要がある場合に適した手法です。 ただし、この手法は通常の処理の一部として例外をキャッチする方法に依存しますが、一般的には推奨されず、パフォーマンスの問題が発生する可能性があります。 代わりに、XAML ブラウザー アプリケーション (XBAP) がインターネット ゾーン サンドボックス内でのみ実行される場合は、xaml ブラウザー アプリケーション (XBAP) に true を返す BrowserInteropHelper.IsBrowserHosted プロパティを使用できます。
警告
XBAP では、Internet Explorer や古いバージョンの Firefox など、従来のブラウザーが動作する必要があります。 これらの古いブラウザーは、通常、Windows 10 および Windows 11 ではサポートされていません。 最新のブラウザーでは、セキュリティ リスクのために XBAP アプリに必要なテクノロジがサポートされなくなりました。 XBAP を有効にするプラグインはサポートされなくなりました。 詳細については、「WPF ブラウザーでホストされるアプリケーション (XBAP)についてよく寄せられる質問を参照してください。
手記
IsBrowserHosted は、アプリケーションがブラウザーで実行されているかどうかのみが区別され、アプリケーションが実行されているアクセス許可のセットは区別されません。
アクセス許可の管理
既定では、XBAP は部分信頼 (既定のインターネット ゾーンのアクセス許可セット) で実行されます。 ただし、アプリケーションの要件に応じて、アクセス許可のセットを既定から変更できます。 たとえば、XBAP がローカル イントラネットから起動された場合、次の表に示すように、増加したアクセス許可セットを利用できます。
警告
XBAP では、Internet Explorer や古いバージョンの Firefox など、従来のブラウザーが動作する必要があります。 これらの古いブラウザーは、通常、Windows 10 および Windows 11 ではサポートされていません。 最新のブラウザーでは、セキュリティ リスクのために XBAP アプリに必要なテクノロジがサポートされなくなりました。 XBAP を有効にするプラグインはサポートされなくなりました。 詳細については、「WPF ブラウザーでホストされるアプリケーション (XBAP)についてよく寄せられる質問を参照してください。
表 3: LocalIntranet とインターネットのアクセス許可
許可 | 属性 | LocalIntranet | インターネット |
---|---|---|---|
ドメインネームシステム (DNS) | DNS サーバーにアクセスする | はい | いいえ |
環境変数 | 読んでください | はい | いいえ |
ファイルダイアログ | 開ける | はい | はい |
ファイルダイアログ | 無制限 | はい | いいえ |
分離ストレージ | ユーザーによるアセンブリの分離 | はい | いいえ |
分離ストレージ | 不明な隔離 | はい | はい |
分離ストレージ | 無制限のユーザー クォータ | はい | いいえ |
メディア | 安全なオーディオ、ビデオ、画像 | はい | はい |
印刷 | 既定の印刷 | はい | いいえ |
印刷 | 安全な印刷 | はい | はい |
反射 | 発する | はい | いいえ |
安全 | マネージド コードの実行 | はい | はい |
安全 | 付与されたアクセス許可をアサートする | はい | いいえ |
ユーザーインターフェース | 無制限 | はい | いいえ |
ユーザーインターフェース | 安全な最上位レベルのウィンドウ | はい | はい |
ユーザーインターフェース | 独自のクリップボード | はい | はい |
ブラウザ | HTML への安全なフレーム ナビゲーション | はい | はい |
手記
切り取りと貼り付けは、ユーザーが開始したときにのみ部分信頼で許可されます。
アクセス許可を増やす必要がある場合は、プロジェクト設定と ClickOnce アプリケーション マニフェストを変更する必要があります。 詳細については、「WPF XAML ブラウザー アプリケーションの概要 」を参照してください。 次のドキュメントも役立つ場合があります。
ClickOnce アプリケーションをセキュリティで保護します。
XBAP で完全な信頼が必要な場合は、同じツールを使用して、要求されたアクセス許可を増やすことができます。 XBAP は、ローカル コンピューター、イントラネット、またはブラウザーの信頼済みまたは許可されたサイトに一覧表示されている URL からインストールおよび起動された場合にのみ、完全信頼を受け取ります。 アプリケーションがイントラネットまたは信頼済みサイトからインストールされている場合、ユーザーは管理者特権のアクセス許可を通知する標準の ClickOnce プロンプトを受け取ります。 ユーザーは、インストールの続行またはキャンセルを選択できます。
または、任意のセキュリティ ゾーンからの完全信頼配置に ClickOnce 信頼済み配置モデルを使用することもできます。 詳細については、「信頼されたアプリケーションの展開の概要 と セキュリティ」を参照してください。
関連項目
.NET Desktop feedback