开发安全的 WebView2 应用
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
事件)时,始终检查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
。
基于新页面的原点更新设置
根据新页面的原点更新设置,如下所示:
若要防止应用程序导航到某些页面,请使用
NavigationStarting
和FrameNavigationStarting
事件检查页面或框架导航,然后有条件地阻止导航。导航到新页面时,可能需要调整对象上的
CoreWebView2Settings
属性值,以满足新页面的安全要求,如上述 限制 Web 内容功能中所述。
删除公开的主机对象
导航到新文档时,请使用 ContentLoading
事件 和 RemoveHostObjectFromScript
删除公开的主机对象。
WebView2 不能以系统用户身份运行
WebView2 不能以系统用户身份运行。 此限制会阻止生成凭据提供程序等方案。