WebView2 允许开发人员在本机应用程序中托管 Web 内容。 如果使用得当,托管 Web 内容具有多种优势,例如使用基于 Web 的 UI、访问 Web 平台的功能或跨平台共享代码。
在 Web 浏览器中,网站在沙盒环境中被授予有限权限。 但是,在本机应用程序中托管 Web 内容时,Web 内容可以访问本机应用程序的资源和 API。 如果 Web 内容未正确与主机应用程序隔离,则可能导致安全漏洞。 若要避免这些漏洞,请遵循以下做法来提高 WebView2 应用程序的安全性。
将所有 Web 内容视为不安全内容
始终检查在 WebView2 中运行的文档的来源,并评估内容的可信度,尤其是在使用
ExecuteScript、PostWebMessageAsJson、PostWebMessageAsString或任何其他方法将信息发送到 WebView2 控件之前。 WebView2 控件可能已通过最终用户与导致导航的页面中的页面或脚本交互导航到另一个页面。 可以从 WebView2 控件的属性中Source获取文档的源。请小心
AddScriptToExecuteOnDocumentCreated. 所有navigations后续都运行相同的脚本,如果该脚本提供对仅适用于特定来源的信息的访问权限,则任何 HTML 文档都可以访问本机应用程序的资源和 API。在使用前先验证 Web 消息和主机对象参数,因为 Web 消息和参数可能格式错误 (无意或恶意) ,并可能导致应用出现意外行为。
检查方法调用的结果
ExecuteScript(事件WebMessageReceived)时,请始终检查SourceWebView2 控件的属性以检查发件人的源,或检查从 WebView2 控件中的 HTML 文档接收信息的任何其他机制,以验证 HTML 文档的 URI 是否是你所期望的。
避免使用通用代理
设计特定的 Web 消息和主机对象交互,而不是使用通用代理。
用于 PostWebMessageAsJson 发送消息
使用该 PostWebMessageAsJson 方法将消息发送到 WebView2 控件。 在构造要发送到 WebView2 控件的消息时,首选使用 PostWebMessageAsJson JSON 库并构造 JSON 字符串参数。 这避免了将信息编码为 JSON 字符串或脚本的任何潜在意外,并确保任何攻击者控制的输入都无法修改 JSON 消息的其余部分或运行任意 JavaScript 代码。
限制 Web 内容功能
如果不需要,则限制 Web 内容功能。 更新 WebView2 属性 CoreWebView2Settings 以限制 Web 内容的功能,如下所示:
如果您不希望 Web 内容访问主机对象,则设置为
AreHostObjectsAllowedfalse。如果不希望 Web 内容将 Web 消息发布到本机应用程序,请设置为
IsWebMessageEnabledfalse。IsScriptEnabledfalse如果不希望 Web 内容运行脚本,则设置为 (例如,在显示静态 HTML 内容) 时。如果不希望 Web 内容显示或显示对话框,请设置为
AreDefaultScriptDialogsEnabledfalse。promptalert
基于新页面的来源更新设置
基于新页面的来源更新设置,如下所示:
若要防止应用程序导航到某些页面,请使用 and
NavigationStartingFrameNavigationStarting事件检查页面或框架导航,然后有条件地阻止导航。导航到新页面时,可能需要调整对象上的
CoreWebView2Settings属性值以匹配新页面的安全要求,如上面的限制 Web 内容功能中所述。
删除公开的主机对象
导航到新文档时,请使用 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来确保在 Azure 中使用特定频道切换到预览频道以测试即将推出的 API 和功能 - 选择 “注册表项 ”选项卡,然后选择“查找HKCU”。 -
设置浏览器可执行文件夹 (以进行本地测试) in 切换 到预览频道以测试即将推出的 API 和功能 - 选择 “注册表项 ”选项卡,然后选择“查找
HKCU”。 -
使用 Visual Studio Code 调试 WebView2 应用 - 查找
HKEY_CURRENT_USER.
- 切换频道搜索顺序 (推荐) 切换到预览频道以测试即将推出的 API 和功能 - 选择“注册表项”选项卡,然后选择“查找
AdditionalBrowserArguments低于HKCU的注册表替代将被忽略。HKEY_LOCAL_MACHINE遵守 (HKLM) 策略替代。 请参阅:- 切换频道搜索顺序 (推荐) 切换到预览频道以测试即将推出的 API 和功能 - 选择“注册表项”选项卡,然后选择“查找
HKLM”。 -
如何使用
ChannelSearchKind来确保在 Azure 中使用特定频道切换到预览频道以测试即将推出的 API 和功能 - 选择 “注册表项 ”选项卡,然后选择“查找HKLM”。 -
设置浏览器可执行文件夹 (以进行本地测试) in 切换 到预览频道以测试即将推出的 API 和功能 - 选择 “注册表项 ”选项卡,然后选择“查找
HKLM”。
- 切换频道搜索顺序 (推荐) 切换到预览频道以测试即将推出的 API 和功能 - 选择“注册表项”选项卡,然后选择“查找
非提升的 WebView2 应用遵循所有支持的替代机制。
另请参阅:
- 分发应用和 WebView2 运行时 - 查找“提升”。