javascript - 在应用程序打包的本地页面上启用 Electron 中的 nodeIntegration 是否安全?

标签 javascript node.js electron

在关闭 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'>&#xE921;</div>
<div id='maximize' class='noSelect'>&#xE922;</div>
<div id='restore' class='noSelect'>&#xE923;</div>
<div id='close' class='noSelect'>&#xE8BB;</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: 配置选项传递给 BrowserWindowElectron's documentation有一些示例可以帮助您入门。此外,熟悉 Eelectron's security recommendations 也是个好主意。 .

关于javascript - 在应用程序打包的本地页面上启用 Electron 中的 nodeIntegration 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57505082/

相关文章:

javascript - 如何在jquery中获取当前的url

node.js - Backbone.js 和 Node.js 有什么区别?哪个最好?

node.js - 如果我知道地址和私钥,如何在 web3 中导入以太坊帐户?

linux - 在 electron-installer-snap 中指定包依赖

node.js - 有没有一种方法可以在没有 CLI 的情况下运行 Nodejs 脚本?

javascript - Passport.js 注册似乎有效,但用户凭据未插入数据库

javascript - 选择选项更改时更改文本区域的值

javascript - setState 不更新状态数组

node.js - 错误 : Cannot find module 'cors'

javascript - 用 Electron 返回多个回调函数中的值时出错