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