ASP.NET Core Blazor Hybrid 安全注意事项
注意
此版本不是本文的最新版本。 对于当前版本,请参阅此文的 .NET 8 版本。
警告
此版本的 ASP.NET Core 不再受支持。 有关详细信息,请参阅 .NET 和 .NET Core 支持策略。 对于当前版本,请参阅此文的 .NET 8 版本。
本文介绍了 Blazor Hybrid 应用的安全注意事项。
呈现 Web 内容的 Blazor Hybrid 应用在平台 Web View 内执行 .NET 代码。 .NET 代码通过 .NET 代码和 Web View 之间的互操作通道与 Web 内容交互。
呈现到 Web View 中的 Web 内容可以来自以下任一位置的应用提供的资产:
- 应用中的
wwwroot
文件夹。 - 应用外部的源。 例如,网络源(如 Internet)。
.NET 代码与在 Web View 内运行的代码之间存在信任边界。 .NET 代码由应用和已安装的任何受信任的第三方包提供。 生成应用后,.NET 代码 Web View 内容源将无法更改。
与 .NET 代码内容源相比,在 Web View 内运行的代码的内容源不仅可以来自应用,还可以来自外部源。 例如,外部内容分发网络 (CDN) 的静态资产可由应用 Web View 使用或呈现。
将 Web View 中的代码视为不受信任,就像在浏览器中运行的网络应用代码不受信任一样。 与其他类型的应用一样,相同的威胁和一般安全建议也适用于 Blazor Hybrid 应用中不受信任的资源。
如果可能,请避免从第三方来源加载内容。 为了降低风险,可以直接从应用提供内容,方法是下载外部资产,验证它们是否可以安全地向用户提供服务,然后将其放入应用的 wwwroot
文件夹中,以便使用应用的 rest 进行封包。 下载外部内容以包含在应用中时,建议先进行扫描以检查有无病毒和恶意软件,然后再将其放入应用的 wwwroot
文件夹。
如果你的应用必须引用来自外部来源的内容,我们建议你使用常见的 Web 安全方法,以便应用有机会在内容泄露时阻止内容加载:
- 使用 TLS/HTTPS 安全地提供内容。
- 实施内容安全策略 (CSP)。
- 执行子资源完整性检查。
即使所有资源都打包到应用中,并且不会从任何外部来源加载,但应对运行在 Web View 内的资源代码问题保持谨慎态度,因为资源可能有漏洞,这些漏洞会导致跨站脚本 (XSS) 攻击。
一般情况下,Blazor 框架通过以安全方式处理 HTML 来防范 XSS。 但是,某些编程模式允许 Razor 组件将原始 HTML 注入呈现的输出中,例如从不受信任的源呈现内容。 例如,应避免直接从数据库呈现 HTML 内容。 此外,应用使用的 JavaScript 库可能会以不安全的方式操作 HTML,从而无意或故意呈现不安全的输出。
出于这些原因,最好对通常应用于 Web 应用的 XSS 采取相同的防范措施。 防止从未知源加载脚本,且不执行可能不安全的 JavaScript 功能,例如 eval
和其他不安全的 JavaScript 基元。 建议建立 CSP,以减少这些安全风险。
如果 Web View 中的代码遭到入侵,代码将获取对 Web View 中的所有内容的访问权限,并且可能会通过互操作通道与主机进行交互。 为此,来自 Web View(事件、JS 互操作)的任何内容都必须视为不受信任,并采用与其他敏感上下文(例如在遭受入侵的 Blazor Server 应用中,该应用可能导致对主机系统的恶意攻击)相同的方式进行验证。
请勿在 Web View 的上下文中存储敏感信息(如凭据、安全令牌或敏感用户数据),因为如果 Web View 遭到入侵,这些信息便可以为网络攻击者所用。 也有更安全的替代方法,例如直接在应用的本机部分中处理敏感信息。
在 iframe
中呈现的外部内容
使用 iframe
在 Blazor Hybrid 页面中显示外部内容时,我们建议用户利用沙盒功能确保内容与包含应用的父页面隔离。 在以下 Razor 组件示例中,<iframe>
标记存在 sandbox
属性,用于将沙盒功能应用于 admin.html
页面:
<iframe sandbox src="https://contoso.com/admin.html" />
警告
早期浏览器版本中不支持 sandbox
属性。 有关详细信息,请参阅我能否使用:sandbox
。
指向外部 URL 的链接
应用外部 URL 的链接在适当的外部应用中打开,而不是在 Web View 中加载。 我们不建议重写默认行为。
使 Web View 在已部署的应用中保持最新
BlazorWebView 控件使用当前安装的、特定于平台的本机 Web View。 由于本机 Web View 会定期更新以支持新 API 并修复安全问题,因此可能有必要确保应用程序使用符合应用程序要求的 Web View 版本。
若要使 Web View 保持为最新的部署应用,请使用以下方法之一:
- 在所有平台上:检查 Web View 版本并提示用户执行任何必要的步骤来更新它。
- 仅在 Windows 上:在应用中打包固定版本 Web View,使用它代替系统的共享 Web View。
Android
Android Web View 通过 Google Play Store 分发和更新。 通过读取 User-Agent
字符串检查 Web View 版本。 使用 JavaScript 互操作读取 Web View 的 navigator.userAgent
属性,如果在 Razor 组件上下文之外需要用户代理字符串,则可选择使用单一实例服务缓存该值。
使用 Android Emulator 时:
- 使用预安装了 Google Play Services 的模拟设备。 不支持未预安装 Google Play Services 的模拟设备。
- 从 Google Play Store 安装 Google Chrome。 如果已安装 Google Chrome,请从 Google Play Store 更新 Chrome。 如果模拟设备未安装最新版本的 Chrome,则可能未安装最新版本的 Android Web View。
iOS/Mac Catalyst
iOS 和 Mac Catalyst 都使用 WKWebView
,这是一个基于 Safari 的控件,由操作系统更新。 与 Android 案例类似,通过读取 Web View 的 User-Agent
字符串来确定 Web View 版本。
Windows(.NET MAUI、WPF、Windows 窗体)
在 Windows 上,需要基于 Chromium 的 Microsoft Edge WebView2
才能运行 Blazor Web 应用。
使用最新安装的 WebView2
版本(称为 Evergreen distribution)。 如果要将特定版本的 WebView2
与应用一起提供,请使用 Fixed Version distribution。
有关检查当前安装的 WebView2
版本和分发模式的详细信息,请参阅 WebView2
分发文档。