为了在加载远程内容时提供合适的安全级别,必须分别启用和禁用 BrowserWindow
的 contextIsolation
和 nodeIntegration
选项。在这种情况下,主渲染器进程将无法使用 Node/Electron API。为了公开特定功能,窗口的预加载脚本可能会利用 Electron 的 contextBridge
功能,为主渲染器提供对选定 Node/Electron API 的访问权限。
尽管 Electron 文档中提供了信息,但总体上缺乏 contextBridge
用法的具体示例。一般来说,现有的文档/教程在实现 Electron 应用程序时并不关注采用安全实践。
以下是我在网上找到的一个 contextBridge
用法示例:https://github.com/reZach/secure-electron-template
您能否提供可能对实现安全 Electron 应用程序(依赖于 contextBridge
功能)有用的其他资源/示例?
关于 contextBridge
最佳实践的见解也受到高度赞赏。
最佳答案
我是模板的作者,让我提供一些您可能会觉得有用的背景知识。免责声明:我不是安全研究人员,但这是从多个来源抓取的。
ContextBridge 很重要,因为它提供 保护 防止基于旧方式将值传递到渲染器进程。
老方法
const {
ipcRenderer
} = require("electron");
window.send = function(channel, data){
// whitelist channels
let validChannels = ["toMain"];
if (validChannels.includes(channel)) {
ipcRenderer.send(channel, data);
}
};
window.recieve = function(channel, func){
let validChannels = ["fromMain"];
if (validChannels.includes(channel)) {
// Deliberately strip event as it includes `sender`
ipcRenderer.on(channel, (event, ...args) => func(...args));
}
};
这段代码容易受到客户端打开开发工具,修改 window.send
和 window.recieve
的函数定义的攻击。然后,客户端可以开始在您的 main.js 脚本中 ping 您的 ipcMain,然后可能会造成一些损害,因为它们可以绕过预加载 js 中的白名单 ipc channel 。这假设您也在 main.js 中加入了白名单,但我已经看到很多示例,这些示例没有并且容易受到此类攻击。来自 the docs :
换句话说,因为我们使用
contextBridge.exposeInMainWorld
,我们的渲染器进程不能修改我们公开的函数的定义,保护我们免受可能的安全攻击向量。新方式
const {
contextBridge,
ipcRenderer
} = require("electron");
// Expose protected methods that allow the renderer process to use
// the ipcRenderer without exposing the entire object
contextBridge.exposeInMainWorld(
"api", {
send: (channel, data) => {
// whitelist channels
let validChannels = ["toMain"];
if (validChannels.includes(channel)) {
ipcRenderer.send(channel, data);
}
},
receive: (channel, func) => {
let validChannels = ["fromMain"];
if (validChannels.includes(channel)) {
// Deliberately strip event as it includes `sender`
ipcRenderer.on(channel, (event, ...args) => func(...args));
}
}
}
);
Source关于javascript - Electron 'contextBridge',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59993468/