- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
为了在加载远程内容时提供适当的安全级别,必须分别启用和禁用 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 脚本中对 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));
}
}
}
);
关于javascript - Electron 'contextBridge',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59993468/
为了在加载远程内容时提供适当的安全级别,必须分别启用和禁用 BrowserWindow 的 contextIsolation 和 nodeIntegration 选项。在这种情况下,Node/Elec
平台 Electron - 12.0.8 平台 – macOS 10.15.7 描述 我正在尝试显示来自 Electron 渲染器进程的文件对话框。我想我可以像通过 contextBridge 引用
我是一名优秀的程序员,十分优秀!