隔離模式
隔離模式是一種在前端發送的 Tauri API 訊息到達 Tauri Core 之前,使用 JavaScript 攔截和修改它們的方式。隔離模式注入的安全 JavaScript 程式碼稱為隔離應用程式。
原因
隔離模式的目的是為開發人員提供一種機制,以協助保護其應用程式免受前端對 Tauri Core 的不必要或惡意呼叫。隔離模式的需求源於在前端運行不受信任內容所帶來的威脅,這對於具有許多依賴項的應用程式來說是一種常見情況。請參閱安全性:威脅模型,其中列出了應用程式可能遇到的許多威脅來源。
上述描述的最大威脅模型是開發威脅,隔離模式的設計就考慮到了這一點。不僅許多前端建置時工具包含數十個(或數百個)通常深度巢狀的依賴項,而且複雜的應用程式也可能具有大量(也常常是深度巢狀的)依賴項,這些依賴項會捆綁到最終輸出中。
何時
Tauri 強烈建議在任何可以使用隔離模式的情況下都使用它。由於隔離應用程式攔截所有來自前端的訊息,因此它始終可以使用。
當您使用外部 Tauri API 時,Tauri 也強烈建議鎖定您的應用程式。作為開發人員,您可以利用安全的隔離應用程式來嘗試驗證 IPC 輸入,以確保它們在某些預期參數範圍內。例如,您可能想要檢查讀取或寫入檔案的呼叫是否嘗試存取應用程式預期位置之外的路徑。另一個範例是確保 Tauri API HTTP 提取呼叫僅將 Origin 標頭設定為您的應用程式預期的值。
也就是說,它會攔截所有來自前端的訊息,因此它甚至可以與始終開啟的 API(例如 事件)一起使用。由於某些事件可能會導致您自己的 Rust 程式碼執行操作,因此相同的驗證技術也可以用於它們。
如何
隔離模式的全部意義在於在前端和 Tauri Core 之間注入一個安全的應用程式,以攔截和修改傳入的 IPC 訊息。它透過使用 <iframe>
的沙箱功能,在主前端應用程式旁邊安全地運行 JavaScript 來實現這一點。Tauri 在載入頁面時強制執行隔離模式,強制所有對 Tauri Core 的 IPC 呼叫都先路由通過沙箱化的隔離應用程式。一旦訊息準備好傳遞到 Tauri Core,它就會使用瀏覽器的 SubtleCrypto 實現進行加密,然後傳遞回主前端應用程式。到達那裡後,它會直接傳遞到 Tauri Core,然後在其中解密並像往常一樣讀取。
為了確保沒有人可以手動讀取應用程式特定版本的金鑰,並使用它在加密後修改訊息,每次運行應用程式時都會生成新的金鑰。
IPC 訊息的大致步驟
為了更容易理解,以下是有序列表,其中包含 IPC 訊息在使用隔離模式傳送到 Tauri Core 時將經歷的大致步驟
- Tauri 的 IPC 處理程序接收到訊息
- IPC 處理程序 -> 隔離應用程式
[沙箱]
隔離應用程式鉤子運行並可能修改訊息[沙箱]
訊息使用運行時生成的金鑰透過 AES-GCM 加密[已加密]
隔離應用程式 -> IPC 處理程序[已加密]
IPC 處理程序 -> Tauri Core
注意:箭頭 (->) 表示訊息傳遞。
效能意涵
由於訊息的確發生了加密,因此與 棕地模式 相比,即使安全的隔離應用程式什麼都不做,也會產生額外的開銷成本。除了對效能敏感的應用程式(它們可能具有精心維護且少量依賴項,以保持足夠的效能)之外,大多數應用程式都不應注意到加密/解密 IPC 訊息的運行時成本,因為它們相對較小,並且 AES-GCM 相對較快。如果您不熟悉 AES-GCM,那麼在此上下文中相關的是,它是 SubtleCrypto 中包含的唯一經過身份驗證的模式演算法,並且您可能每天已經在 TLS 的底層使用它。
每次 Tauri 應用程式啟動時,還會生成一個密碼學上安全的金鑰。如果系統已經有足夠的熵來立即返回足夠的隨機數,通常不會注意到這一點,這在桌面環境中極為常見。如果在無頭環境中運行以執行一些 使用 WebDriver 的整合測試,那麼如果您的作業系統未包含熵生成服務,您可能需要安裝某種類型的熵生成服務,例如 haveged
。Linux 5.6(2020 年 3 月)現在包含使用推測執行的熵生成。
限制
隔離模式存在一些由於平台不一致性而產生的限制。最顯著的限制是由於外部檔案在 Windows 上的沙箱 <iframes>
內無法正確載入。因此,我們在建置時實作了一個簡單的腳本內聯步驟,該步驟會取得相對於隔離應用程式的腳本內容,並將它們內聯注入。這表示典型的捆綁或簡單包含檔案(例如 <script src="index.js"></script>
)仍然可以正常運作,但較新的機制(例如 ES Modules)將無法成功載入。
建議
由於隔離應用程式的重點是防止開發威脅,因此我們強烈建議您盡可能保持隔離應用程式的簡單。您不僅應該努力保持依賴項的最小化,而且還應考慮保持所需的建置步驟最小化。這將使您不必擔心針對隔離應用程式(在您的前端應用程式之上)的供應鏈攻擊。
建立隔離應用程式
在此範例中,我們將建立一個小型 hello-world 樣式的隔離應用程式,並將其連接到一個想像中現有的 Tauri 應用程式。它不會對通過它的訊息進行任何驗證,只會將內容列印到 WebView 控制台中。
為了本範例的目的,讓我們想像一下我們與 tauri.conf.json
位於同一個目錄中。現有的 Tauri 應用程式已將其 distDir
設定為 ../dist
。
../dist-isolation/index.html
:
<!doctype html><html lang="en"> <head> <meta charset="UTF-8" /> <title>Isolation Secure Script</title> </head> <body> <script src="index.js"></script> </body></html>
../dist-isolation/index.js
:
window.__TAURI_ISOLATION_HOOK__ = (payload) => { // let's not verify or modify anything, just print the content from the hook console.log('hook', payload); return payload;};
現在,我們需要做的就是設定我們的 tauri.conf.json
組態以使用隔離模式,並從 棕地模式 啟動到隔離模式。
組態
假設我們的主前端 distDir
設定為 ../dist
。我們也將隔離應用程式輸出到 ../dist-isolation
。
{ "build": { "distDir": "../dist" }, "app": { "security": { "pattern": { "use": "isolation", "options": { "dir": "../dist-isolation" } } } }}
© 2025 Tauri 貢獻者。CC-BY / MIT