WebView2 可讓開發人員在原生應用程式中託管網頁內容。 如果使用得當,託管 Web 內容具有多種優勢,例如使用 Web 型 UI、存取 Web 平台的功能或跨平台共享程式碼。
在網頁瀏覽器中,網站在沙箱環境中被授予有限的權力。 不過,在原生應用程式中託管 Web 內容時,Web 內容可以存取原生應用程式的資源和 API。 如果 Web 內容未正確與主機應用程式隔離,這可能會導致安全性漏洞。 若要避免這些弱點,請遵循下列作法來改善 WebView2 應用程式的安全性。
將所有網頁內容視為不安全
請務必檢查 WebView2 內執行之文件的來源,並評估內容的可信度,尤其是在使用 、
PostWebMessageAsJson、PostWebMessageAsString或任何其他ExecuteScript方法將資訊傳送到 WebView2 控制項之前。 WebView2 控制項可能已透過使用者與導致瀏覽的頁面中的頁面或指令碼互動,瀏覽至另一個頁面。 您可以從 WebView2 控制項的屬性取得Source文件的來源。請小心
AddScriptToExecuteOnDocumentCreated。 所有未來的navigations指令碼都會執行相同的指令碼,而且如果該指令碼提供僅適用於特定來源的資訊存取權,則任何 HTML 文件都可以存取原生應用程式的資源和 API。取用 Web 訊息和主機物件參數之前,請先驗證它們,因為 Web 訊息和參數可能會格式錯誤 (無意或惡意地) ,並可能導致應用程式異常行為。
檢查方法呼叫的
ExecuteScript結果也就是WebMessageReceived事件時,請務必檢查SourceWebView2 控制項的屬性以檢查寄件者的來源,或在 WebView2 控制項中檢查從 HTML 文件接收資訊的任何其他機制,以驗證 HTML 文件的 URI 是否為您所期望的。
避免使用一般 Proxy
設計特定的 Web 訊息和主物件互動,而不是使用通用 Proxy。
用 PostWebMessageAsJson 來傳送訊息
使用方法傳送 PostWebMessageAsJson 訊息至 WebView2 控制項。 建構訊息以傳送到 WebView2 控制項時,最好使用 PostWebMessageAsJson JSON 程式庫來使用並建構 JSON 字串參數。 這可避免將資訊編碼成 JSON 字串或指令碼的任何潛在意外,並確保任何由攻擊者控制的輸入都無法修改 JSON 訊息的其餘部分或執行任意 JavaScript 程式碼。
限制網頁內容功能
如果不需要,請限制網頁內容功能。 更新 WebView2 屬性 CoreWebView2Settings 以限制 Web 內容的功能,如下所示:
如果您不期望網頁內容存取主物件,請設定
AreHostObjectsAllowed為false。如果您不希望 Web 內容將 Web 訊息張貼至原生應用程式,請設
IsWebMessageEnabled為false。如果您不期望網頁內容執行指令碼,請設
IsScriptEnabledfalse為 (例如,在) 顯示靜態 HTML 內容時。如果您不預期顯示網頁內容
alert或prompt對話方塊,請設定AreDefaultScriptDialogsEnabledfalse為 。
根據新頁面的來源更新設定
根據新頁面的來源更新設定,如下所示:
若要防止應用程式瀏覽至特定頁面,請使用
NavigationStartingANDFrameNavigationStarting事件來檢查頁面或框架瀏覽,然後有條件地封鎖瀏覽。瀏覽至新頁面時,您可能需要調整物件上的
CoreWebView2Settings屬性值,以符合新頁面的安全性需求,如上述 限制網頁內容功能中所述。
移除公開的主機物件
瀏覽至新文件時,請使用 ContentLoading 事件 和 RemoveHostObjectFromScript 移除公開的主物件。
無法以系統使用者身分執行 WebView2
您無法以系統使用者身分執行 WebView2。 此限制會封鎖建置認證提供者之類的案例。
WebView2 主機應用程式的建議權限等級
基於安全性最佳作法,建議您在以標準 (非提升權限) 使用者完整性執行的處理程序中裝載 WebView2。 依照最低權限原則,應用程式應避免以較高的 (系統管理員) 權限執行 WebView2 裝載元件。
如果您的應用程式針對某些作業需要提高權限,建議您在個別的專用處理程序中隔離該工作,並讓 WebView2 主機元件保持解除權限。 這可將瀏覽器裝載介面保持在所需的最低權限層級,並符合建議的 Windows 應用程式安全性做法。
對於提升權限的主機應用程式,請使用適當的覆寫旗標
針對提升權限的 WebView2 主應用程式處理程序,請使用適當的覆寫旗標類型。 提升的製程是高完整性等級 (高 IL) 製程。 為了協助保護提升權限的程序免於標準使用者可修改的設定,WebView2 會在主機程序以提升權限執行時忽略特定以使用者為範圍的覆寫機制。
當主機程序以提升權限執行時:
WEBVIEW2_*環境變數覆寫 (旗標) 會遭到忽略,包括WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS。 請參閱:- 在 WebView2 瀏覽器旗標的本地裝置環境中設定瀏覽器旗標。
接受透過 WebView2 API 在 WebView2 應用程式中指定的設定旗標。 請參閱:
- 透過 WebView2 瀏覽器旗標中的程式碼,以程式設計方式設定瀏覽器旗標。
HKEY_CURRENT_USER(HKCU) 會忽略原則覆寫。 請參閱:-
切換通道搜尋順序 (建議的) 切換 至預覽通道以測試即將推出的 API 和功能 - 選取 [ 登錄機碼] 索引標籤,然後選取 [尋找
HKCU]。 -
如何使用
ChannelSearchKind以確保 在 切換 到預覽通道以測試即將推出的 API 和功能 - 選取 [ 登錄機碼] 索引標籤,然後尋找HKCU。 -
將瀏覽器可執行檔資料夾 (設定為本機測試) 切換 到預覽通道以測試即將推出的 API 和功能 - 選取 [ 登錄機碼 ] 索引標籤,然後尋找
HKCU。 -
使用 Visual Studio Code 偵錯 WebView2 應用程式 - 尋找
HKEY_CURRENT_USER。
-
切換通道搜尋順序 (建議的) 切換 至預覽通道以測試即將推出的 API 和功能 - 選取 [ 登錄機碼] 索引標籤,然後選取 [尋找
AdditionalBrowserArguments將忽略低於HKCU的登錄覆寫。HKEY_LOCAL_MACHINE(HKLM) 原則覆寫將被接受。 請參閱:-
切換通道搜尋順序 (建議的) 切換 至預覽通道以測試即將推出的 API 和功能 - 選取 [ 登錄機碼] 索引標籤,然後選取 [尋找
HKLM]。 -
如何使用
ChannelSearchKind以確保 在 切換 到預覽通道以測試即將推出的 API 和功能 - 選取 [ 登錄機碼] 索引標籤,然後尋找HKLM。 -
將瀏覽器可執行檔資料夾 (設定為本機測試) 切換 到預覽通道以測試即將推出的 API 和功能 - 選取 [ 登錄機碼 ] 索引標籤,然後尋找
HKLM。
-
切換通道搜尋順序 (建議的) 切換 至預覽通道以測試即將推出的 API 和功能 - 選取 [ 登錄機碼] 索引標籤,然後選取 [尋找
非提升權限的 WebView2 應用程式會遵守所有支援的覆寫機制。
另請參閱:
- 發佈您的應用程式和 WebView2 執行階段 - 尋找「提升權限」。