如果渲染进程可以随意访问主进程或者预加载脚本的任意对象,那就意味着网页可以随意操作我们的electron浏览器,乃至系统的底层功能,这是非常不安全的。基于安全性的考虑,electron提供了contextBridge模块,它保证上下文隔离,这里用代码说明一下:
不隔离的情况下:
// preload.js——预加载脚本
window.eleAPI = {
doAll: () => {}
}
// renderer.js_渲染进程
window.eleAPI.doAll()
这种情况,渲染进程可以访问预加载脚本中任何想要访问的暴露接口。
隔离的情况:
// 在上下文隔离启用的情况下使用预加载
const { contextBridge } = require('electron')
contextBridge.exposeInMainWorld('eleAPI', {
doAll: () => {}
})
// 考虑通信的情况
contextBridge.exposeInMainWorld('eleAPI', {
loadPreferences: () => ipcRenderer.invoke('load-prefs')
})
暴露进程间通信相关 API 的正确方法是为每一种通信消息提供一种实现方法。