为了在加载远程内容时提供合适的安全级别,必须分别启用和禁用 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 的函数定义的攻击。然后,客户端可以开始在您的 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/

10-11 12:59