隔離網頁應用程式 (IWA) 提供安全模式,讓網頁應用程式存取強大的功能 (例如直接通訊端和受控頁框),這些功能通常會在標準「隨機」網頁中受到限制。由於 IWA 在高信任度環境中運作,因此必須遵守嚴格的安全和隱私權政策。這些規範旨在確保網頁平台功能日益強大時,使用者仍能安全無虞,且瀏覽器環境的完整性不受影響。
IWA 信任模型
IWA 平台的核心是嚴格的技術政策,可強制開發人員維持高安全等級。標準網頁應用程式採用彈性權限模型,而 IWA 則經過加密簽署,並使用 Web Bundle 傳送,因此可驗證來源和完整性。
IWA 可透過這個經過驗證的身分,存取具備特殊權限的 API。為維護這份信任,開發人員必須採取安全至上的做法,遵守更嚴格的政策,包括採用完善的內容安全政策 (CSP) 和信任類型,確保使用者即使使用強大的功能,也能享有安全保障。也就是說:
- 透明度:應用程式使用高權限 API 時,不應讓使用者感到意外。
- 最低權限:應用程式只應要求及使用聲明用途所需的特定功能。
- 靜態完整性:所有可執行的邏輯都必須包含在應用程式套件中,以利進行安全性稽核,並防止側載惡意程式碼。
雖然 IWA 內建強大的保護機制 (例如嚴格的內容安全政策 (CSP),可防止執行外部指令碼),但單靠技術限制無法降低所有風險。即使是在高信任度環境中,某些實作模式或開發人員選擇仍可能在無意間危害使用者安全或隱私。本指南將說明這些受限情境,以及管理特權 API 使用情形的政策。
這些規範的重要性
遵守這些政策不僅是為了符合規定,更是為了建立進階網頁應用程式的可持續生態系統。遵循這些規範可確保應用程式:
- 避免安全性回歸:保持邏輯獨立,防止跨網站指令碼 (XSS) 和遠端執行程式碼等安全漏洞。
- 保護使用者隱私:確保只有在使用者明確表示意願並瞭解相關資訊時,才會處理敏感資料和硬體存取權。
- 確保平台長期運作:協助維持 IWA 平台所需的高安全標準,以便持續擴充功能。
核心原則
資訊公開和使用者意圖
最基本的規則是:不要讓使用者感到意外。應用程式的行為必須符合其聲明用途和使用者期望。
- 符合範圍規定:請勿實作超出應用程式明確用途的功能。
- API 占用空間極小:只要求及使用應用程式核心功能所需的特定 IWA API。
禁止側載動態程式碼
IWA 安全性模型取決於管理員或瀏覽器供應商驗證所有可執行邏輯的能力。因此,IWA 套件必須是獨立的。平台會透過嚴格的內容安全政策 (CSP) 強制執行這項規定,封鎖以字串為基礎的執行作業,例如 eval() 和 new Function():
script-src 'self' 'wasm-unsafe-eval';
require-trusted-types-for 'script';
雖然 CSP 允許 'wasm-unsafe-eval' 支援 WebAssembly,但您不得規避這項安全界線的精神。
嚴格禁止的做法
- 傳送遠端程式碼的解譯器:您不得納入程式碼解譯器 (例如編譯為 WASM 的 Python 或 Lua),透過 Direct Sockets 等具備權限的網路存取權,下載及執行外部指令碼。
- 遠端載入的邏輯:請勿使用 Service Worker 將遠端載入的程式碼嵌入 IWA 來源。
- 程式碼與資料:雖然可以下載資料 (例如 JSON),但下載任何要解譯或執行的程式碼,都直接違反政策。
最低權限原則
請務必使用可完成工作的最低效能 API。請勿使用專屬 IWA 的高權限 API,做為規避標準 Web API 安全限制或使用者提示的捷徑。下表列出常見用途,協助您決定何時該使用傳統 Web API,而非 IWA 專屬功能:
| 工作 | 使用標準 Web API (建議) | 避免使用具備特殊權限的 IWA API (受限制) |
|---|---|---|
| 外接硬碟存取權 | 使用 File System Access API 進行標準檔案 I/O。 | 請勿使用「Unrestricted WebUSB」存取儲存空間。 |
| 智慧卡互動 | 使用 Smart Card API。 | 請勿使用智慧卡專用的「不受限制的 WebUSB」。 |
| 序列裝置通訊 | 如果 WebSerial API 足以因應裝置需求,請使用這個 API。 | 如果 WebSerial 可以執行工作,請避免使用「Unrestricted WebUSB」。 |
| 嵌入信任的內容 | 使用標準 <iframe>。 |
除非需要隔離,否則請勿使用 <controlledframe> 進行簡單的嵌入作業。 |
API 專屬指南
IWA API 提供強大的功能,這些功能通常會在瀏覽器中受到限制。一般來說,請勿以會讓使用者感到意外,或損害使用者信任感和資料的方式,使用這些具備特殊權限的功能。
Direct Sockets API
Direct Sockets API 可授予原始 TCP 和 UDP 存取權,包括多點播送和本機網路存取權。
允許
- 支援自訂通訊協定:連線至使用自訂通訊協定的遠端伺服器,目前沒有適用於這類通訊協定的高階 Web API。
- 維護後端服務:連線至預先定義的硬式編碼伺服器,專門用於應用程式的後端服務。
- 探索必要硬體:存取區域網路或使用多點傳播,探索應用程式功能所需的特定相關硬體 (例如,影片編輯應用程式尋找網路附加儲存裝置)。
不允許
- 讓使用者感到意外:實作網路存取權,但應用程式的主要功能並未明確需要這項權限,例如文字編輯器與本機網路裝置通訊。
- 任意掃描網路:對使用者的本機網路執行廣泛掃描 (例如掃描 192.168.1.0/24 的連接埠),以建立使用者設定檔或探索不相關的裝置。
- 鎖定本機裝置:嚴禁嘗試探查、重新設定或攻擊區域網路上的其他裝置。
Controlled Frame API
<controlledframe> 元素可嵌入及修改跨來源內容,包括插入指令碼和變更標頭。
允許
- 簡化使用者介面:嵌入第三方服務並插入 CSS,隱藏不相關的 UI 元素,或提供更一致的體驗。
- 中介安全通訊:透過
postMessage接收內嵌網頁的要求,並只傳回透過具備權限的 API 擷取、經過清理的必要資料,藉此擔任守門員。
不允許
- 竊取使用者憑證:注入指令碼,從嵌入的內容擷取密碼、工作階段 Cookie 或其他機密使用者資料。
- 違反服務條款:以違反服務條款的方式變更嵌入式平台,例如透過程式輔助點擊廣告或未經授權抓取資料。
- 代理具備權限的存取權:建立直通,讓不受信任的嵌入內容直接或不受控地存取具備權限的 IWA API。
- 實作不受控的 AI:透過 AI 代表登入的使用者執行動作,但沒有明確、透明的使用案例限制。
無限制錄製螢幕畫面
允許擷取螢幕畫面,不必像標準網頁一樣重複提示使用者授權。
允許
- 提供核心功能:將螢幕截圖做為應用程式服務的明顯一部分,例如虛擬會議或教學影片錄製功能。
- 確保使用者知情:在使用者與應用程式互動前,清楚告知他們可能會錄製畫面。
不允許
- 偷偷錄製:在未事先徵得使用者明確同意的情況下,擷取使用者的螢幕畫面。
- 違反隱私權法規:從事任何違反當地或國際隱私權法的錄音行為。
不受限的 WebUSB
無限制的 WebUSB 會略過標準 WebUSB 封鎖清單,允許與裝置進行低階互動。
允許
- 支援專屬硬體:與沒有高階網頁 API 的專屬或舊版硬體互動,例如工業控制器。
現在允許
- 略過專用 API:針對有更具體、受限 API 的裝置使用 WebUSB,例如智慧卡 (使用 Smart Card API) 或外部儲存空間 (使用 File System Access API)。
視窗管理 (window.open 和 window.focus)
IWA 可以建立彈出式視窗和焦點視窗,無須標準網頁所需的使用者手勢。
允許
- 通知工作完成:當使用者啟動的重大背景工作 (例如影片算繪) 完成時,將焦點放在應用程式視窗上。
不允許
- 垃圾內容:向使用者傳送大量來路不明的視窗。
- 網路釣魚:開啟設計成模仿系統對話方塊或欺騙使用者的視窗。
- 搶奪焦點:從其他應用程式搶奪焦點,干擾使用者操作,但事件並非重大。
結論
獨立網頁應用程式的安全架構旨在協助開發人員,同時為使用者維持高信任度的環境。遵守這些規範,可確保應用程式在 IWA 生態系統中保持負責任的狀態。本指南最重要的要點如下:
- 優先考量公開透明:應用程式的行為應一律符合其聲明用途,絕不實作會讓使用者感到意外或受騙的功能。
- 強制執行套件完整性:所有可執行的邏輯都必須包含在 IWA 組合中,才能進行靜態驗證。嚴格禁止透過動態程式碼側載或遠端解譯器,規避安全防護機制。
- 遵守最低權限原則:請一律為特定工作選取限制最多的可用 API。只有在標準 Web API 無法滿足應用程式核心功能需求時,才應使用具備特殊權限的 IWA API。
- 擔任守門員:使用
<controlledframe>等強大工具時,IWA 必須擔任安全中介者,而非不信任內容的透明 Proxy。
發布 IWA 前,請先進行最後的實作稽核,並確認以下事項:
- 我是否使用最簡單、限制最多的 API 來完成這項工作?
- 使用者是否會對應用程式的行為感到驚訝或遭到背叛?
如果第一個問題的答案是「否」,或第二個問題的答案是「是」,您的應用程式可能違反 IWA 安全性政策,因此可能會遭到移除。