electron [Feature Request]: Preload scripts for Web Worker

r55awzrz  于 6个月前  发布在  Electron
关注(0)|答案(3)|浏览(77)

预检清单

我已经阅读了 Contributing Guidelines 项目的相关文档。
我同意遵循 Code of Conduct 项目所遵循的规定。
我在 issue tracker 中搜索了一个与我想提交的功能请求相匹配的特性,但没有成功。

问题描述

使用选项 nodeIntegrationInWorker 在工作线程中启用节点集成是不安全的,因为它使得任何具有该功能的工作者都可以访问非常强大的API,而无需对其进行控制。

建议解决方案

在 BrowserWindow 的 webPreferences 中添加一个名为 'preloadInWorker' 的标志,以指定在 Web Workers 中的任何其他脚本之前加载的脚本。该脚本将始终可以访问 node APIs,并且旨在引入将在 worker 范围内可见的全局符号,这些符号被认为是足够安全的,可以使用。这应该与 'preload' 选项的工作方式相同,但适用于 web worker 线程。

考虑的其他替代方案

其他信息

zlhcx6iw

zlhcx6iw2#

@codebytere 有什么办法可以帮助解决这个问题吗?我正在使用预加载来覆盖并隐藏一些敏感的API,以便在浏览器上下文中隐藏它们。然而,我发现它们实际上并没有在workers中加载。这意味着没有办法修复像Electron's broken atob/btoa implementation这样的问题,或者隐藏像电池/键盘/gpuinfo这样的API,使其无法被访问。这将有助于修复workers中的这些敏感API,从而提高web上下文的安全性。对于最新的electron 20和21版本,这仍然是一个相关的问题,因为目前没有办法在workers中运行预加载。

wrrgggsh

wrrgggsh3#

这个问题是在依赖需要访问某些(但不是所有)Node API的worker时,主要的安全加固障碍。为了让worker支持预加载脚本,需要做哪些工作?

从我了解的情况来看,类似于以下代码片段在 https://github.com/electron/electron/blob/db2bf1a0d1be6b81ca2d1a6b693b78753d3ba6ea/shell/renderer/web_worker_observer.cc#L48C25-L48C55 中加载当前worker的预加载脚本,是这样吗?

auto* isolate = context->GetIsolate();
auto binding = v8::Object::New(isolate);
InitializeBindings(binding, context, render_frame);

std::vector<v8::Local<v8::String>> sandbox_preload_bundle_params = {
node::FIXED_ONE_BYTE_STRING(isolate, "binding")};

std::vector<v8::Local<v8::Value>> sandbox_preload_bundle_args = {binding};

util::CompileAndCall(
isolate->GetCurrentContext(), "electron/js2c/sandbox_bundle",
&sandbox_preload_bundle_params, &sandbox_preload_bundle_args);

v8::HandleScope handle_scope(isolate);
v8::Context::Scope context_scope(context);

但是我假设还有一些其他步骤需要完成?一些快速的头脑 Storm :

  • 为worker配置不同的预加载脚本,而不是为渲染器配置
  • 可能:允许传入一个回调函数,该函数可以根据worker名称决定是否加载预加载脚本(这对于在同一项目中运行第一方受信任的worker和第三方不受信任的worker非常重要)?
  • 需要加载并初始化该脚本
  • 需要更新测试
  • 需要更新文档

也许对代码有更多了解的人可以告诉更多关于将此引入Electron的努力?从查看git历史记录来看,可能是@codebytere或@miniak?

相关问题