開發安全的 WebView2 應用程式
WebView2 可讓開發人員在原生應用程式中裝載 Web 內容。 正確使用時,裝載 Web 內容會提供數個優點,例如使用 Web 型 UI、存取 Web 平臺的功能,或跨平臺共用程式代碼。
在網頁瀏覽器中,沙盒化環境中的網站獲授與有限許可權。 不過,在原生應用程式中裝載 Web 內容時,Web 內容可以存取原生應用程式的資源和 API。 如果 Web 內容未正確地與主應用程式隔離,這可能會導致安全性弱點。 若要避免這些弱點,請遵循下列做法來改善 WebView2 應用程式的安全性。
將所有 Web 內容視為不安全
請務必檢查在 WebView2 內執行的檔原點,並評估內容的可信度,特別是在使用
ExecuteScript
、PostWebMessageAsJson
、PostWebMessageAsString
或任何其他方法將資訊傳送至 WebView2 控制件之前。 WebView2 控制件可能已透過使用者與頁面中的頁面或腳本互動而流覽至另一個頁面,導致導覽。 檔的原點可以從Source
WebView2 控制件的 屬性取得。請小心使用
AddScriptToExecuteOnDocumentCreated
。 所有未來navigations
都會執行相同的腳本,而且如果該腳本提供僅適用於特定來源的資訊存取權,則任何 HTML 檔都可以存取原生應用程式的資源和 API。在取用 Web 訊息和主機物件參數之前,請先驗證它們,因為 Web 訊息和參數的格式可能不正確, (不小心或惡意) ,而且可能會導致應用程式非預期地運作。
檢查方法呼叫的結果
ExecuteScript
時,這是一個事件,請一WebMessageReceived
律檢查Source
WebView2 控件的 屬性以檢查寄件者來源,或檢查任何其他從 WebView2 控件中的 HTML 檔接收資訊的機制,以驗證 HTML 檔的 URI 是您預期的。
避免泛型 Proxy
設計特定的 Web 訊息和主機對象互動,而不是使用泛型 Proxy。
用來 PostWebMessageAsJson
傳送訊息
PostWebMessageAsJson
使用方法將訊息傳送至 WebView2 控制件。 建構訊息以傳送至 WebView2 控件時,偏好使用 PostWebMessageAsJson
並使用 JSON 連結庫建構 JSON 字串參數。 這可避免將資訊編碼到 JSON 字串或腳本中的任何潛在意外,並確保攻擊者控制的輸入無法修改其餘的 JSON 訊息,或執行任意的 JavaScript 程式代碼。
限制 Web 內容功能
如果不需要,請限制 Web 內容功能。 更新 中的 WebView2 屬性 CoreWebView2Settings
,以限制 Web 內容的功能,如下所示:
如果您不預期 Web 內容會存取主機物件,請將 設定
AreHostObjectsAllowed
為false
。false
如果您不預期 Web 內容會將 Web 訊息張貼到原生應用程式,請將 設定IsWebMessageEnabled
為 。設定
IsScriptEnabled
為false
,如果您不預期 Web 內容會執行腳本 (例如,當顯示靜態 HTML 內容時) 。如果您不預期 Web 內容會顯示
alert
或prompt
對話框,請將 設定AreDefaultScriptDialogsEnabled
為false
。
根據新頁面的來源更新設定
根據新頁面的原點更新設定,如下所示:
若要防止您的應用程式瀏覽至特定頁面,請使用
NavigationStarting
和FrameNavigationStarting
事件來檢查頁面或框架導覽,然後有條件地封鎖導覽。流覽至新頁面時,您可能需要調整物件上的
CoreWebView2Settings
屬性值,以符合新頁面的安全性需求,如上述 限制 Web 內容功能中所述。
拿掉公開的主機物件
流覽至新檔時,請使用 ContentLoading
事件和 RemoveHostObjectFromScript
來移除公開的主機物件。
WebView2 無法以系統使用者身分執行
WebView2 無法以系統使用者身分執行。 此限制會封鎖建置認證提供者之類的案例。