セキュリティで保護された WebView2 アプリを開発する

WebView2 を使用すると、開発者はネイティブ アプリケーションで Web コンテンツをホストできます。 正しく使用すると、Web コンテンツをホストすることには、Web ベースの UI の使用、Web プラットフォームの機能へのアクセス、クロスプラットフォームでのコードの共有など、いくつかの利点があります。

Web ブラウザーでは、サンドボックス環境では Web サイトの権限が制限されます。 ただし、ネイティブ アプリケーションで Web コンテンツをホストする場合、Web コンテンツはネイティブ アプリケーションのリソースと API にアクセスできます。 これにより、Web コンテンツがホスト アプリケーションから適切に分離されていない場合、セキュリティの脆弱性が生じる可能性があります。 これらの脆弱性を回避するには、以下の方法に従って WebView2 アプリケーションのセキュリティを向上させます。

すべての Web コンテンツを安全でないものとして扱う

  • 特に、ExecuteScriptPostWebMessageAsJsonPostWebMessageAsString などの方法を使用して WebView2 コントロールに情報を送信する前に、常に WebView2 内で実行されているドキュメントの配信元をチェックし、コンテンツの信頼性を評価します。 WebView2 コントロールは、エンド ユーザーがページまたはナビゲーションの原因となっているページ内のスクリプトを操作することを介して、別のページに移動した可能性があります。 ドキュメントの配信元は、WebView2 コントロールの Source プロパティから取得できます。

  • AddScriptToExecuteOnDocumentCreatedに注意してください。 将来のすべての navigations は同じスクリプトを実行し、そのスクリプトが特定の配信元のみを意図した情報へのアクセスを提供する場合、任意の HTML ドキュメントがネイティブ アプリケーションのリソースと API にアクセスできる可能性があります。

  • Web メッセージとパラメーターは (意図せず、または悪意のある) 形式が正しくない可能性があり、アプリが予期しない動作をする可能性があるため、それらを使用する前に Web メッセージとホスト オブジェクト パラメーターを検証してください。

  • WebMessageReceived イベントである ExecuteScript メソッド呼び出しの結果を調べるときは、常に WebView2 コントロールの Source プロパティチェック送信者のソースをチェックするか、WebView2 コントロールで HTML ドキュメントから情報を受信するその他のメカニズムをチェックして、HTML ドキュメントの URI が期待どおりであることを検証します。

汎用プロキシを避ける

汎用プロキシを使用するのではなく、特定の Web メッセージを設計し、オブジェクトの相互作用をホストします。

PostWebMessageAsJson を使用してメッセージを送信する

PostWebMessageAsJson メソッドを使用して、WebView2 コントロールにメッセージを送信します。 WebView2 コントロールに送信するメッセージを作成する場合は、 PostWebMessageAsJson を使用し、JSON ライブラリを使用して JSON 文字列パラメーターを構築することをお勧めします。 これにより、情報を JSON 文字列またはスクリプトにエンコードする際の潜在的な事故を回避し、攻撃者が制御する入力が JSON メッセージの残りの部分を変更したり、任意の JavaScript コードを実行したりすることはできません。

Web コンテンツ機能を制限する

必要がない場合は、Web コンテンツ機能を制限します。 次のように、 CoreWebView2Settings の WebView2 プロパティを更新して、Web コンテンツの機能を制限します。

  • Web コンテンツがホスト オブジェクトにアクセスしないことが想定されている場合は、[ AreHostObjectsAllowed ] を [ false] に設定します。

  • Web コンテンツで Web メッセージがネイティブ アプリケーションに投稿されることが想定されない場合は、[ IsWebMessageEnabled ] を [ false] に設定します。

  • Web コンテンツでスクリプトが実行されることを予期しない場合 (たとえば、静的な HTML コンテンツを表示している場合)、 IsScriptEnabledfalse に設定します。

  • Web コンテンツにalertダイアログまたはpromptダイアログが表示されない場合は、[AreDefaultScriptDialogsEnabled] を [false] に設定します。

新しいページの配信元に基づいて設定を更新する

次のように、新しいページの配信元に基づいて設定を更新します。

  • アプリケーションが特定のページに移動できないようにするには、NavigationStarting イベントと FrameNavigationStarting イベントを使用してページ ナビゲーションまたはフレーム ナビゲーションをチェックし、条件付きでナビゲーションをブロックします。

  • 新しいページに移動するときには、前の「Web コンテンツ機能を制限する」で説明したように、新しいページのセキュリティ要件と一致するように CoreWebView2Settings オブジェクトのプロパティ値を調整する必要がある場合があります。

公開されているホスト オブジェクトを削除する

新しいドキュメントに移動するときは、 ContentLoading イベントと RemoveHostObjectFromScript を使用して、公開されているホスト オブジェクトを削除します。

WebView2 はシステム ユーザーとして実行できません

WebView2 はシステム ユーザーとして実行できません。 この制限により、資格情報プロバイダーの構築などのシナリオがブロックされます。

セキュリティに関するベスト プラクティスとして、標準の (管理者特権ではない) ユーザー整合性で実行されるプロセスで WebView2 をホストすることをお勧めします。 最小特権の原則に従い、アプリケーションは、昇格された (管理者) 特権で WebView2 ホスティング コンポーネントを実行しないようにする必要があります。

アプリケーションで特定の操作に対して昇格された特権が必要な場合は、その作業を個別の専用プロセスで分離し、WebView2 ホスト コンポーネントの昇格解除された状態を維持することをお勧めします。 これにより、ブラウザー ホスティング画面が必要とされる最小の特権レベルに維持され、推奨される Windows アプリケーションのセキュリティ プラクティスと一致します。

管理者特権のホスト アプリの場合は、適切なオーバーライド フラグを使用します

管理者特権の WebView2 ホスト アプリ プロセスの場合は、適切な種類のオーバーライド フラグを使用します。 昇格されたプロセスは、高整合性レベル (高 IL) プロセスです。 標準ユーザーが変更できる構成から管理者特権のプロセスを保護するために、WebView2 は、ホスト プロセスが管理者特権で実行されているときに、特定のユーザー スコープのオーバーライド メカニズムを無視します。

ホスト プロセスが管理者特権で実行されている場合:

管理者特権ではない WebView2 アプリは、サポートされているすべてのオーバーライド メカニズムを尊重します。

関連項目:

関連項目