学习 Electron - 上下文隔离

Electron 上下文隔离

用于确保 预加载脚本 和 Electron 的内部逻辑运行在所加载的 webcontent 页面之外的独立上下文环境中。

这对于安全性很重要。因为它有助于阻止网站访问 Electron 的内部组件和预加载脚本可访问的高等级权限 API。

所以,预加载脚本所访问的 window 对象不是网页能访问的对象。在预加载脚本对 window 对象进行的更改不会应用于页面上。

默认情况下,启用上下文隔离。

通过使用 contextBridge 暴露内容给页面。

// preload.js
const { contextBridge } = require('electron')

contextBridge.exposeInMainWorld('example', {
  example_handle: () => 'this is one example.'
})

// renderer.js
window.example.example_handle()
// or
example.example_handle()

需要注意的是,任何直接的暴露高级权限 API 是不安全的。

contextBridge.exposeInMainWorld('Api', {
  send: ipcRenderer.send // 这会暴露该 API,允许页面发送任意 IPC 消息
})
// 因此,需要用辅助函数将该方法包裹
contextBridge.exposeInMainWorld('Api', {
  send: () => ipcRenderer.send('example')
})

在 Typescript 中

在预加载脚本中定义的 API 不会包裹在渲染器的 window 中。

因此,需要增加相关类型声明。

// preload.ts
contextBridge.exposeInMainWorld('electronAPI', {
  loadPreferences: () => ipcRenderer.invoke('load-prefs')
})

// renderer.d.ts
export interface IElectronAPI {
  loadPreferences: () => Promise<void>,
}
// 全局增强 window 接口

declare global {
  interface Window {
    electronAPI: IElectronAPI
  }
}

学习 Electron - 上下文隔离
http://localhost:8080/archives/da9720d9-34de-454b-b70a-e1c1e873ccd4
作者
inksha
发布于
2024年09月14日
许可协议