开发安全的 WebView2 应用

WebView2 允许开发人员在本机应用程序中托管 Web 内容。 正确使用时,托管 Web 内容具有多种优势,例如使用基于 Web 的 UI、访问 Web 平台的功能或跨平台共享代码。

在 Web 浏览器中,网站在沙盒环境中被授予有限的权限。 但是,在本机应用程序中托管 Web 内容时,Web 内容可以访问本机应用程序的资源和 API。 如果 Web 内容未正确与主机应用程序隔离,则可能会导致安全漏洞。 若要避免这些漏洞,请遵循以下做法来提高 WebView2 应用程序的安全性。

将所有 Web 内容视为不安全内容

  • 始终检查在 WebView2 中运行的文档的来源,并评估内容的可信度,尤其是在使用 ExecuteScriptPostWebMessageAsJsonPostWebMessageAsString或任何其他方法将信息发送到 WebView2 控件之前。 WebView2 控件可能通过最终用户导航到另一个页面,该用户与导致导航的页面或脚本进行交互。 可以从 WebView2 控件的 属性获取 Source 文档的来源。

  • 使用 时要小心 AddScriptToExecuteOnDocumentCreated。 所有将来 navigations 都运行相同的脚本,如果该脚本提供仅针对特定来源的信息的访问权限,则任何 HTML 文档都可能有权访问本机应用程序的资源和 API。

  • 在使用 Web 消息和主机对象参数之前验证它们,因为 Web 消息和参数格式可能不正确, (无意或恶意) ,并可能导致应用出现意外行为。

  • 检查方法调用的结果 ExecuteScript (即 WebMessageReceived 事件)时,始终检查 Source WebView2 控件的 属性以检查发件人的源,或检查从 WebView2 控件中的 HTML 文档接收信息的任何其他机制,以验证 HTML 文档的 URI 是否是预期的。

避免使用泛型代理

设计特定的 Web 消息和主机对象交互,而不是使用泛型代理。

使用 PostWebMessageAsJson 发送消息

PostWebMessageAsJson使用 方法将消息发送到 WebView2 控件。 构造要发送到 WebView2 控件的消息时,首选使用 PostWebMessageAsJson JSON 库并构造 JSON 字符串参数。 这避免了将信息编码为 JSON 字符串或脚本的任何潜在事故,并确保攻击者控制的输入无法修改 JSON 消息的其余部分或运行任意 JavaScript 代码。

限制 Web 内容功能

如果不需要,请限制 Web 内容功能。 更新 中的 CoreWebView2Settings WebView2 属性以限制 Web 内容的功能,如下所示:

  • false如果不希望 Web 内容访问主机对象,请将 设置为 AreHostObjectsAllowed

  • false如果不希望 Web 内容将 Web 消息发布到本机应用程序,请将 设置为 IsWebMessageEnabled

  • false如果不希望 Web 内容 (运行脚本(例如,在显示静态 HTML 内容) 时),请将 设置为 IsScriptEnabled

  • false如果不希望显示 alert Web 内容或prompt对话框,请将 设置为 AreDefaultScriptDialogsEnabled

基于新页面的原点更新设置

根据新页面的原点更新设置,如下所示:

  • 若要防止应用程序导航到某些页面,请使用 NavigationStartingFrameNavigationStarting 事件检查页面或框架导航,然后有条件地阻止导航。

  • 导航到新页面时,可能需要调整对象上的 CoreWebView2Settings 属性值,以满足新页面的安全要求,如上述 限制 Web 内容功能中所述。

删除公开的主机对象

导航到新文档时,请使用 ContentLoading 事件 和 RemoveHostObjectFromScript 删除公开的主机对象。

WebView2 不能以系统用户身份运行

WebView2 不能以系统用户身份运行。 此限制会阻止生成凭据提供程序等方案。