Electron 保险丝
打包时的特性切换
什么是保险丝?
对于 Electron 功能的子集,禁用整个应用程序的某些功能是合理的。例如,99% 的应用程序不使用 `ELECTRON_RUN_AS_NODE`,这些应用程序希望能够交付一个无法使用该功能的二进制文件。我们也不希望 Electron 用户从源代码构建 Electron,因为这既是一项巨大的技术挑战,又需要大量的时间和金钱成本。
保险丝是解决此问题的方法,从高层次上讲,它们是 Electron 二进制文件中的“神奇位”,可以在打包 Electron 应用程序时翻转,以启用/禁用某些功能/限制。因为它们是在您对应用程序进行代码签名之前在打包时翻转的,所以操作系统负责确保这些位不会通过操作系统级代码签名验证(Gatekeeper/App Locker)被翻转回来。
当前的保险丝
runAsNode
默认:已启用
@electron/fuses: FuseV1Options.RunAsNode
runAsNode 保险丝控制是否尊重 `ELECTRON_RUN_AS_NODE` 环境变量。请注意,如果禁用此保险丝,则主进程中的 `process.fork` 将无法按预期工作,因为它依赖于此环境变量才能正常工作。相反,我们建议您使用 实用程序进程,它们适用于您需要独立 Node.js 进程(如 Sqlite 服务器进程或类似场景)的许多用例。
cookieEncryption
默认:已禁用
@electron/fuses: FuseV1Options.EnableCookieEncryption
cookieEncryption 保险丝控制是否使用操作系统级加密密钥对磁盘上的 Cookie 存储进行加密。默认情况下,Chromium 用于存储 Cookie 的 sqlite 数据库以明文形式存储值。如果您希望确保应用程序的 Cookie 以与 Chrome 相同的方式加密,那么您应该启用此保险丝。请注意,这是一个单向转换,如果您启用此保险丝,现有的未加密 Cookie 将在写入时加密,但如果您随后再次禁用保险丝,您的 Cookie 存储将实际上损坏且无用。大多数应用程序可以安全地启用此保险丝。
nodeOptions
默认:已启用
@electron/fuses: FuseV1Options.EnableNodeOptionsEnvironmentVariable
nodeOptions 保险丝控制是否尊重 NODE_OPTIONS
和 NODE_EXTRA_CA_CERTS
环境变量。`NODE_OPTIONS` 环境变量可用于将各种自定义选项传递给 Node.js 运行时,通常不会在生产中被应用程序使用。大多数应用程序可以安全地禁用此保险丝。
nodeCliInspect
默认:已启用
@electron/fuses: FuseV1Options.EnableNodeCliInspectArguments
nodeCliInspect 保险丝控制是否尊重 `--inspect`、`--inspect-brk` 等标志。禁用时,它还确保 `SIGUSR1` 信号不会初始化主进程检查器。大多数应用程序可以安全地禁用此保险丝。
embeddedAsarIntegrityValidation
默认:已禁用
@electron/fuses: FuseV1Options.EnableEmbeddedAsarIntegrityValidation
embeddedAsarIntegrityValidation 保险丝控制 macOS 上一项实验性功能,该功能在加载 `app.asar` 文件时验证其内容。此功能旨在对性能的影响最小,但可能会略微减慢从 `app.asar` 存档内部读取文件的速度。
有关如何使用 asar 完整性验证的更多信息,请阅读 Asar 完整性 文档。
onlyLoadAppFromAsar
默认:已禁用
@electron/fuses: FuseV1Options.OnlyLoadAppFromAsar
onlyLoadAppFromAsar 保险丝更改了 Electron 用于定位应用程序代码的搜索系统。默认情况下,Electron 将按以下顺序进行搜索:`app.asar` -> `app` -> `default_app.asar`。当启用此保险丝时,搜索顺序变为单个条目 `app.asar`,从而确保与 `embeddedAsarIntegrityValidation` 保险丝结合使用时,无法加载未经验证的代码。
loadBrowserProcessSpecificV8Snapshot
默认:已禁用
@electron/fuses: FuseV1Options.LoadBrowserProcessSpecificV8Snapshot
loadBrowserProcessSpecificV8Snapshot 保险丝更改了浏览器进程使用的 V8 快照文件。默认情况下,Electron 的所有进程都将使用相同的 V8 快照文件。当启用此保险丝时,浏览器进程将使用名为 `browser_v8_context_snapshot.bin` 的文件作为其 V8 快照。其他进程将使用它们通常使用的 V8 快照文件。
grantFileProtocolExtraPrivileges
默认:已启用
@electron/fuses: FuseV1Options.GrantFileProtocolExtraPrivileges
grantFileProtocolExtraPrivileges 保险丝更改了从 `file://` 协议加载的页面是否获得超出传统 Web 浏览器中获得的权限。这种行为是 Electron 应用程序在早期版本中核心的,但现在不再需要,因为应用程序应该 从自定义协议提供本地文件。如果您不从 `file://` 提供页面,则应禁用此保险丝。
此保险丝授予 `file://` 协议的额外权限在下面没有完全记录。
file://
协议页面可以使用 `fetch` 通过 `file://` 加载其他资产。file://
协议页面可以使用 Service Worker。file://
协议页面无论沙箱设置如何,都对也在 `file://` 协议上运行的子帧具有通用访问权限。
我如何翻转保险丝?
简单的方法
我们做了一个方便的模块,@electron/fuses
,使翻转这些保险丝变得很容易。查看该模块的 README 以获取有关使用和潜在错误情况的更多详细信息。
const { flipFuses, FuseVersion, FuseV1Options } = require('@electron/fuses')
flipFuses(
// Path to electron
require('electron'),
// Fuses to flip
{
version: FuseVersion.V1,
[FuseV1Options.RunAsNode]: false
}
)
您可以使用保险丝 CLI 验证保险丝是否已翻转或检查任意 Electron 应用程序的保险丝状态。
npx @electron/fuses read --app /Applications/Foo.app
困难的方法
快速词汇表
- 保险丝线:Electron 二进制文件中用于控制保险丝的字节序列。
- 哨兵:您可以用来定位保险丝线的静态已知字节序列。
- 保险丝模式:保险丝线的格式/允许的值。
手动翻转保险丝需要编辑 Electron 二进制文件并修改保险丝线,使其成为代表您想要的状态的保险丝的字节序列。
在 Electron 二进制文件中,将存在一个类似于这样的字节序列。
| ...binary | sentinel_bytes | fuse_version | fuse_wire_length | fuse_wire | ...binary |
sentinel_bytes
始终是此确切字符串:`dL7pKGdnNz796PbbjQWNKmHXBZaB9tsX`fuse_version
是一个单字节,其无符号整数值表示保险丝模式的版本。fuse_wire_length
是一个单字节,其无符号整数值表示以下保险丝线中的保险丝数量。fuse_wire
是 N 个字节的序列,每个字节代表单个保险丝及其状态。- “0”(0x30)表示保险丝已禁用。
- “1”(0x31)表示保险丝已启用。
- “r”(0x72)表示保险丝已移除,将字节更改为 1 或 0 不会有任何影响。
要翻转保险丝,请在保险丝线中找到其位置,并根据您想要的状态将其更改为“0”或“1”。
您可以查看当前模式 此处。