在关闭 nodeIntegration 的情况下创建自定义窗口控件(如关闭、最小/最大和恢复)时,我被卡住了。我在渲染器的本地 html 文件中创建了按钮
main.js
mainWindow = new BrowserWindow({
x, y, width, height,
frame: false,
show: false,
webPreferences: { devTools: true }
});
mainWindow.loadURL(url.format({
protocol: 'file:',
slashes: true,
pathname: path.join(__dirname, 'assets', 'index.html')
}));
index.html
<div id='minimize' class='noSelect'></div>
<div id='maximize' class='noSelect'></div>
<div id='restore' class='noSelect'></div>
<div id='close' class='noSelect'></div>
<script type='text/javascript' src='../assets/js/index.js'></script>
默认情况下,nodeIntegration 处于关闭状态,因此 index.js
无法访问 Node。但是,我需要能够向按钮添加功能以关闭、最小/最大和恢复窗口。
index.js
const { remote } = require('electron');
const mainWindow = remote.getCurrentWindow();
document.getElementById('close').addEventListener('click', () => {
mainWindow.close();
});
由于 nodeIntegration 被禁用,这将无法工作。在本地页面中启用它是否安全?如果不是,执行此操作的安全方法是什么?
最佳答案
TL;DR:启用 nodeIntegration
只会在您从不受信任的来源(即互联网或用户输入)加载和执行代码时带来风险。
如果您完全确定您的应用程序只会运行您创建的代码(并且没有 NodeJS 模块从互联网加载脚本),基本上,如果启用 nodeIntegration
则风险很小.
但是,如果您允许用户运行代码(即输入然后eval
)或者您提供插件 API,您无法从中控制加载的插件,风险级别上升,因为 NodeJS 允许任何 NodeJS 脚本,例如,操作文件系统。
另一方面,如果禁用 nodeIntegration
,则无法与主进程通信或操作 BrowserWindow
,因此无法创建自定义窗口控件。但是,您可以使用“预加载”脚本文件在完全隔离的渲染器和 NodeJS 世界之间架起一座桥梁。
这是通过创建一个脚本文件来完成的,然后在创建时将该脚本文件作为 preload:
配置选项传递给 BrowserWindow
。 Electron's documentation有一些示例可以帮助您入门。此外,熟悉 Eelectron's security recommendations 也是个好主意。 .
关于javascript - 在应用程序打包的本地页面上启用 Electron 中的 nodeIntegration 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57505082/