您如何使用新的、安全的默认设置在 Electron 中“要求”外部模块?

Posted

技术标签:

【中文标题】您如何使用新的、安全的默认设置在 Electron 中“要求”外部模块?【英文标题】:How do you 'require' external modules in Electron with the new, secure, default settings? 【发布时间】:2022-01-20 21:52:11 【问题描述】:

我有一个几年前的 Electron 应用程序,我正在尝试更新它以使用最新版本的 Node、Electron 以及我使用过的所有外部模块。这是一次非常令人沮丧的体验,因为所有范式都发生了变化,尤其是在安全方面,但我希望尽可能让我的应用使用安全设置。

据我了解,Electron 的相关默认设置(我使用的是 16.0.5 版本)是

nodeIntegration: false
contextIsolation: true
sandbox: true

这是我的 createWindow 块中的内容:

const createWindow = () => 
  // Create the browser window.
  const win = new BrowserWindow(
      width: 1280,
      height: 720,
      webPreferences: 
        preload: path.join(__dirname, 'preload.js'),
      
  );

  // and load the index.html of the app.
  win.loadFile('index.html');

  // Open the DevTools.
  win.webContents.openDevTools();

如您所见,我根本没有更改默认值。这是需要的,遵循 Electron 网站上的 security instructions。

但是,由于这个原因,我完全无法恢复我的应用程序以前的功能。我遇到的最大问题是我根本无法找到require 任何外部依赖项的方法。据我了解,预加载文件只能需要特定的 Electron 模块,而普通的渲染器 javascript 文件根本不需要任何东西(您会收到 require() is not defined 错误)。根据我从文档中了解到的情况,main.js 文件具有正常的require 访问权限,您应该使用ipcmain.jspreload.js 之间进行通信,这样只有您的主进程才能完全访问远程模块.

这很好,花花公子,除了我什至不能在require 中写任何东西main.js 让我非常困惑:

// in main.js
const google = require('googleapis');
App threw an error during load
Error: Cannot find module 'googleapis'

我已经确定我 yarn installed 正确,尝试了不同的模块,更改了排序等。我也无法在网上找到某人的单个示例使用新的默认安全设置,但对外部模块使用 require。他们中的每一个都使用require 来表示内置的东西,而preload.js 文件示例,无论是来自谷歌还是官方文档,都只是展示了如何使用windowdocument 调用来公开基本的内置内容preload.js 这真的没什么帮助。

所以这是不可能的吗?我不得不想知道一个不能使用任何公共节点模块的节点/电子应用程序到底有什么意义,所以如果默认的安全设置阻止你拥有一个提供任何有用功能的应用程序,我不知道不知道为什么它们是默认值。我错过了什么?如何在不禁用这些明显关键的安全功能的情况下重新使用 googleapisffmpeg 等外部模块?

【问题讨论】:

【参考方案1】:

事实证明,我出现“找不到模块”错误的原因是因为我将 Yarn 与 pnp 一起使用。 Electron 不支持不在node_modules 文件夹中的包,请参阅discussion on Yarn GitHub 和semi-confirmation of issue on Electron GitHub

切换到nodelinker: node-modulesnodelinker: pnpm.yarnrc.yml 代替nodelinker: pnp 可以解决这个问题。

这仍然只是部分帮助我,因为我必须弄清楚如何允许沙盒渲染器和预加载访问外部模块方法,但它是一个起点并解决了我最初的挫败感“等待 - 你不能要求 任何东西外部的?”

【讨论】:

以上是关于您如何使用新的、安全的默认设置在 Electron 中“要求”外部模块?的主要内容,如果未能解决你的问题,请参考以下文章

使用电子生成器设置电子图标

如何在 electron-vue js 中设置应用程序图标

如何使用 Electron 存储私钥或安全信息/数据

如何在 Electron 应用程序中禁用网络?

通过 Electron 的 IPC 渲染器发送敏感数据

如何使开发工具在 Electron 中默认不显示在屏幕上?