Node.js Electron作为Web浏览器的安全含义

Node.js Electron作为Web浏览器的安全含义,node.js,security,browser,webview,electron,Node.js,Security,Browser,Webview,Electron,一个多星期前,我在Atom论坛(下面的链接)上问了这个问题,但没有收到任何回复,所以我将其转发到这里,希望有人能够提供关于我问题的见解 最近,我接受了一个开源项目,它使用Electron作为前端。该项目有两个要求:它必须是跨平台的,并且必须有一个嵌入式web浏览器(应该能够像典型的浏览器一样浏览web和呈现内容)。考虑到我的应用程序已经占用了相当大的空间,尝试在其旁边使用另一个嵌入式web框架似乎不是一个好主意。因此,为了简化我的项目并保留构建在Electron之上的UI,我正在考虑使用Ele

一个多星期前,我在Atom论坛(下面的链接)上问了这个问题,但没有收到任何回复,所以我将其转发到这里,希望有人能够提供关于我问题的见解


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

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

重要的是要理解…Electron不是web浏览器

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

显示来自不可信来源的任意内容会带来严重的安全风险,Electron不打算处理这种风险

在这一点上,我试图放弃使用Electron作为内置浏览器的想法,但在同一页面上,您可以找到另一个非常有趣的小贴士:

要显示远程内容,请使用
标记或
BrowserView
,[和]确保禁用
nodeIntegration
并启用
contextIsolation

链接:

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

Electron的
webview
标签基于Chromium的
webview
,后者正在经历巨大的架构变化。这会影响
网络视图的稳定性,包括渲染、导航和事件路由。我们目前建议不要使用<代码> WebVIEW/COD>标签,并考虑替代方案,如<代码> iFrAMe<代码>,电子<代码> BrowserView <代码>,或者完全避免嵌入内容的架构。< /P>
链接:

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

  • 禁用
    nodeIntegration
  • 启用
    contextIsolation
在查看安全和最佳实践页面后,我还将附加以下步骤:

  • 拒绝来自远程内容(网络摄像头、麦克风、位置等)的会话权限请求
  • 捕获创建中的
    webview
    元素并取消默认权限
  • 禁用创建新窗口
  • 禁用远程模块
这是在保护外部内容方面需要经历的相当多的步骤。更不用说,在最佳实践页面中还散布了一些其他警告,例如:

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

同样,这个列表只是最小化了风险,并没有消除风险。如果你的目标是显示一个网站,浏览器将是一个更安全的选择

链接:

(在禁用
远程
模块时)

但是,如果您的应用程序可以运行不受信任的内容,并且即使您相应地对渲染器进程进行沙箱处理,远程模块也会使恶意代码很容易逃出沙箱,并通过主进程的更高权限访问系统资源

链接:

更不用说,当导航到
BrowserView
页面时,整个班级都被列为实验班

这一切甚至都没有提到Electron增加的攻击面,比如去年在
webview
组件中的漏洞:CVE-2018-1000136

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

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

在我看来,为了方便起见,让用户接受上述安全影响似乎是不负责任的

话虽如此,我的问题是:您能否安全地使用Electron为不受控制的内容实施web浏览功能,以确保用户的完整性?

谢谢你抽出时间


链接到原始帖子:

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

[项目]必须具有嵌入式web浏览器

所以我认为这个项目不仅仅是一个网络浏览器。还有其他内容可以访问该节点,但您只需要适当地对其中嵌入的web浏览器部分进行沙盒处理,对吗

关于
的评论,是的,它被认为是不稳定的,Electron建议使用
浏览视图。我不认为它被标记为“实验性”的事实必然会阻止你使用它(特别是考虑到电子团队推荐它[尽管可能是两害相权取其一])

实验并不意味着它是不稳定的。这可能仅仅意味着Electron团队正在试验这种方法,但这种方法在未来可能会改变(在这一点上,我希望Electron提供一条向前的过渡路径)。尽管这是一种可能的解释,最终Electron不得不对此进行评论

建议。。。要做两件事:

  • 禁用节点链接
    new BrowserView({ webPreferences: {
        sandbox: true,
        nodeIntegration: false,
        contextIsolation: true,
        preload: "./pathToPreloadScript.js"
    }});