gpt4 book ai didi

node.js - Electron 作为 Web 浏览器的安全影响

转载 作者:行者123 更新时间:2023-12-02 03:02:08 25 4
gpt4 key购买 nike

一个多星期前,我在 Atom 论坛(下面的链接)上提出了这个问题,但没有收到回复,因此我将其重新发布到此处,希望有人能够提供有关我的问题的见解.

<小时/>

最近,我接手了一个开源项目,它使用 Electron 作为前端。该项目有两个要求:它必须是跨平台的,并且必须具有嵌入式Web浏览器(应该能够像典型的浏览器一样浏览Web并呈现内容)。考虑到相当大的足迹 Electron 已经网络化了我的应用程序,尝试在其旁边使用另一个嵌入式 Web 框架似乎是一个坏主意。因此,为了简化我的项目并保留构建在 Electron 之上的 UI,我正在考虑使用 Electron 本身作为 Web 浏览器。这就是我遇到问题的地方。

在 Electron 文档的安全页面中,明确指出,

it is important to understand … Electron is not a web browser

这句话的背景是,Electron(或者更确切地说是在其之上运行的代码)具有与用户操作系统交互的独特能力,这与典型的 Web 应用程序不同。该页面接着说,

displaying arbitrary content from untrusted sources poses a severe security risk that Electron is not intended to handle

此时,我很想放弃使用 Electron 作为内置浏览器的想法,但在同一页面的更下方,您可以找到另一个非常有趣的花絮:

To display remote content, use the <webview> tag or BrowserView , [and] make sure to disable the nodeIntegration and enable contextIsolation

链接:https://electronjs.org/docs/tutorial/security#isolation-for-untrusted-content

首先,关于使用 webview,Electron 自己的文档建议完全避免使用它们:

Electron’s webview tag is based on Chromium’s webview , which is undergoing dramatic architectural changes. This impacts the stability of webviews , including rendering, navigation, and event routing. We currently recommend to not use the webview tag and to consider alternatives, like iframe , Electron’s BrowserView , or an architecture that avoids embedded content altogether.

链接:https://electronjs.org/docs/api/webview-tag

看来我无法避免嵌入内容,我选择考虑使用 BrowserView,但我发现的也不是很有动力。目前的建议是做两件事:

  • 禁用nodeIntegration
  • 启用contextIsolation

查看安全性和最佳实践页面后,我还将附加以下步骤:

  • 拒绝来自远程内容(网络摄像头、麦克风、位置等)的 session 权限请求
  • 捕获webview创建中的元素并剥离默认权限
  • 禁止创建新窗口
  • 禁用远程模块

为了保护外部内容,需要采取相当多的步骤。更不用说,最佳实践页面中还散布着一些额外的警告,如下所示:

(在创建之前验证 webview 选项)

Again, this list merely minimizes the risk, it does not remove it. If your goal is to display a website, a browser will be a more secure option.

链接:https://electronjs.org/docs/tutorial/security#11-verify-webview-options-before-creation

(禁用 remote 模块)

However, if your app can run untrusted content and even if you sandbox your renderer processes accordingly, the remote module makes it easy for malicious code to escape the sandbox and have access to system resources via the higher privileges of the main process.

链接:https://electronjs.org/docs/tutorial/security#15-disable-the-remote-module

更不用说,导航到 BrowserView 时页面上,整个类(class)都被列为实验类。

这一切甚至还没有提到 Electron 创建的附加攻击面,例如 webview 中的漏洞去年的组件:CVE-2018-1000136

现在,考虑到上述所有因素,许多开发人员仍然选择创建网络浏览器,这些浏览器通常使用 Electron 来消费外部和不受控制的内容。

使用 Electron 的浏览器(直接从 Electron 网站链接):

对我来说,为了方便而让用户承受上述安全隐患似乎是不负责任的。

话虽这么说,我的问题是:您能否安全地、确保用户的完整性,使用 Electron 实现针对不受控制内容的 Web 浏览功能?

感谢您的宝贵时间。

<小时/>

原帖链接: https://discuss.atom.io/t/security-implications-in-electron-as-a-web-browser/70653

最佳答案

一些不适合评论框的想法:

[the project] must have an embedded web browser

所以我认为这个项目不仅仅是一个网络浏览器。那里还有其他内容可能可以访问 Node,但您只想将其嵌入式 Web 浏览器部分适本地沙箱化,对吗?

关于<webview>的评论,是的,它被认为不稳定,Electron 建议使用 BrowserView反而。我不认为它被标记为“实验性”的事实一定会阻止您使用它(特别是考虑到 Electron 团队正在推荐它[尽管可能是两害相权取其一])。

实验并不意味着它不稳定。这可能只是意味着 Electron 团队正在尝试这种方法,但这种方法将来可能会发生变化(届时我希望 Electron 能够提供一条前进的过渡路径)。尽管这是一种可能的解释,但最终 Electron 必须对此发表评论。

The advice... is to do two things:

  • disable nodeIntegration
  • enable contextIsolation

我还会使用 sandbox option继承自BrowserWindows BrowserView's docs在构造函数选项上说:

webPreferences Object (optional) - See BrowserWindow.

这告诉我 BrowserView接受与 BrowserWindow 相同的选项.

你可以这样设置:

new BrowserView({ webPreferences: {
sandbox: true,
nodeIntegration: false,
contextIsolation: true,
preload: "./pathToPreloadScript.js"
}});

查看有关此方法的更多信息 here 。预加载脚本会将一些 Node IPC API 公开给您正在加载的沙盒内容。请注意Status section在底部,写着:

Please use the sandbox option with care, as it is still an experimental feature. We are still not aware of the security implications of exposing some Electron renderer APIs to the preload script

如果您正在加载的内容 BrowserView永远不需要与应用程序进行通信,那么您根本不需要预加载脚本,只需将 BrowserView 沙箱化即可.

After looking at the security and best-practices page, I will also append the following steps:

  • deny session permission requests from remote content (webcam, microphone, location, etc.)
  • catch webview elements in creation and strip default privileges
  • disable the creation of new windows
  • disable the remote module

当然,这些听起来很合理。请注意,如果您的嵌入式浏览器需要能够打开新窗口(通过 window.open<a target="_blank" /> ),那么您必须允许弹出窗口。

That is a fair amount of steps to undergo in securing external content.

当然,但是您主要关心的是应用程序的安全性,还是需要做多少工作才能确保其安全?浏览器开发人员需要考虑类似的事情,以确保网页无法访问操作系统。这只是游戏的一部分。

Again, this list merely minimizes the risk, it does not remove it. If your goal is to display a website, a browser will be a more secure option.

这只是说,如果您想要做的所有只是显示一个网站,那么只需使用浏览器,因为这就是它们的用途。

如果您需要做其他事情,那么您就无法使用浏览器,因此您必须制作自己的应用程序,并确保其相当安全。

我认为,如果您遵循安全文档中的建议并及时了解新的 Electron 版本,那么您就已经尽力了。

至于这是否足够好,我不能说。这取决于您正在开发什么以及您想要防范什么。

但是,我的想法无法替代 Electron 团队中更专业的意见。这个问题当然需要他们的一些指导。

关于node.js - Electron 作为 Web 浏览器的安全影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59458233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com