gpt4 book ai didi

javascript - Electron 'contextBridge'

转载 作者:太空宇宙 更新时间:2023-11-04 01:18:54 25 4
gpt4 key购买 nike

为了在加载远程内容时提供适当的安全级别,必须分别启用和禁用 BrowserWindowcontextIsolationnodeIntegration 选项。在这种情况下,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.sendwindow.recieve 函数定义的影响。然后,客户端可以开始在 ma​​in.js 脚本中对 ipcMain 进行 ping 操作,然后可能会造成一些损害,因为它们可能会绕过预加载 js 中的白名单 ipc channel 。这假设您也在 main.js 中将其列入白名单,但我见过很多示例,但它们并未列入白名单,而且很容易受到此类攻击。

来自the docs :

Function values are proxied to the other context and all other values are copied and frozen. Any data / primitives sent in the API object become immutable and updates on either side of the bridge do not result in an update on the other side.

换句话说,因为我们使用了 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com