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 之間的 Interop 通道,與 Web 內容互動。
轉譯到 Web View 的 Web 內容可能來自下列其中一個位置的應用程式所提供的資產:
- 應用程式中的
wwwroot
資料夾。 - 應用程式外部的來源。 舉例來說,網路來源,例如網際網路。
.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,以不小心或刻意轉譯不安全的輸出。
基於這些理由,對 XSS 最好採用通常適用於 Web 應用程式的相同保護措施。 防止從未知來源載入指令碼,且不會實作可能不安全的 JavaScript 功能,例如 eval
和其他不安全的 JavaScript 基本類型。 建議建立 CSP 來降低這些安全性風險。
如果 Web View 內的程式碼遭到入侵,程式碼會取得 Web View 內所有內容的存取權,而且可能會透過 Interop 通道與主機互動。 因此,必須將來自 Web View (事件、JS Interop) 的任何內容視為不受信任,並以與其他敏感性內容 (例如在可能導致主機系統上惡意攻擊的遭入侵 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 商店散發和更新。 讀取 User-Agent
字串來檢查 Web View 版本。 使用 JavaScript Interop 讀取 Web View 的 navigator.userAgent
屬性,並在 Razor 元件內容外部需要使用者代理程式字串時,選擇性地使用單一服務快取值。
使用 Android Emulator 時:
- 使用預先安裝 Google Play Services 的模擬裝置。 不支援未預先安裝 Google Play Services 的模擬裝置。
- 從 Google Play 商店安裝 Google Chrome。 如果已安裝 Google Chrome,請從 Google Play 商店更新 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 Forms)
在 Windows 上,需要以 Chromium 為基礎的 Microsoft Edge WebView2
才能執行 Blazor Web 應用程式。
會使用最新安裝的 WebView2
版本 (稱為 Evergreen distribution)。 如果您想要隨著應用程式寄送特定版本的 WebView2
,請使用 Fixed Version distribution。
如需有關檢查目前安裝 WebView2
的版本和散發模式的詳細資訊,請參閱 WebView2
散發文件。