- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
一个多星期前,我在 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 orBrowserView
, [and] make sure to disable thenodeIntegration
and enablecontextIsolation
链接:https://electronjs.org/docs/tutorial/security#isolation-for-untrusted-content
首先,关于使用 webview,Electron 自己的文档建议完全避免使用它们:
Electron’s
webview
tag is based on Chromium’swebview
, which is undergoing dramatic architectural changes. This impacts the stability ofwebviews
, including rendering, navigation, and event routing. We currently recommend to not use thewebview
tag and to consider alternatives, likeiframe
, Electron’sBrowserView
, or an architecture that avoids embedded content altogether.
链接:https://electronjs.org/docs/api/webview-tag
看来我无法避免嵌入内容,我选择考虑使用 BrowserView,但我发现的也不是很有动力。目前的建议是做两件事:
nodeIntegration
contextIsolation
查看安全性和最佳实践页面后,我还将附加以下步骤:
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/
我正在学习构建单页应用程序 (SPA) 所需的所有技术。总而言之,我想将我的应用程序实现为单独的层,其中前端仅使用 API Web 服务(json 通过 socket.io)与后端通信。前端基本上是
当我看到存储在我的数据库中的日期时。 这是 正常 。日期和时间就是这样。 但是当我运行 get 请求来获取数据时。 此格式与存储在数据库 中的格式不同。为什么会发生这种情况? 最佳答案 我认为您可以将
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在尝试使用backbone.js 实现一些代码 和 hogan.js (http://twitter.github.com/hogan.js/) Hogan.js was developed ag
我正在使用 Backbone.js、Node.js 和 Express.js 制作一个 Web 应用程序,并且想要添加用户功能(登录、注销、配置文件、显示内容与该用户相关)。我打算使用 Passpor
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
我尝试在 NodeJS 中加载数据,然后将其传递给 ExpressJS 以在浏览器中呈现 d3 图表。 我知道我可以通过这种方式加载数据 - https://github.com/mbostock/q
在 node.js 中,我似乎遇到了相同的 3 个文件名来描述应用程序的主要入口点: 使用 express-generator 包时,会创建一个 app.js 文件作为生成应用的主要入口点。 通过 n
最近,我有机会观看了 john papa 关于构建单页应用程序的精彩类(class)。我会喜欢的。它涉及服务器端和客户端应用程序的方方面面。 我更喜欢客户端。在他的实现过程中,papa先生在客户端有类
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我是一个图形新手,需要帮助了解各种 javascript 2D 库的功能。 . . 我从 Pixi.js 中得到了什么,而我没有从 Konva 等基于 Canvas 的库中得到什么? 我从 Konva
我正在尝试将一些 LESS 代码(通过 ember-cli-less)构建到 CSS 文件中。 1) https://almsaeedstudio.com/ AdminLTE LESS 文件2) Bo
尝试查看 Express Passport 中所有登录用户的所有 session ,并希望能够查看当前登录的用户。最好和最快的方法是什么? 我在想也许我可以在登录时执行此操作并将用户模型数据库“在线”
我有一个 React 应用程序,但我需要在组件加载完成后运行一些客户端 js。一旦渲染函数完成并加载,运行与 DOM 交互的 js 的最佳方式是什么,例如 $('div').mixItUp() 。对
请告诉我如何使用bodyparser.raw()将文件上传到express.js服务器 客户端 // ... onFilePicked(file) { const url = 'upload/a
我正在尝试从 Grunt 迁移到 Gulp。这个项目在 Grunt 下运行得很好,所以我一定是在 Gulp 中做错了什么。 除脚本外,所有其他任务均有效。我现在厌倦了添加和注释部分。 我不断收到与意外
我正在尝试更改我的网站名称。找不到可以设置标题或应用程序名称的位置。 最佳答案 您可以在 config/ 目录中创建任何文件,例如 config/app.js 包含如下内容: module.expor
经过多年的服务器端 PHP/MySQL 开发,我正在尝试探索用于构建现代 Web 应用程序的新技术。 我正在尝试对所有 JavaScript 内容进行排序,如果我理解得很好,一个有效的解决方案可以是服
我是 Nodejs 的新手。我在 route 目录中有一个 app.js 和一个 index.js。我有一个 app.use(multer....)。我还定义了 app.post('filter-re
我正在使用 angular-seed用于构建我的应用程序的模板。最初,我将所有 JavaScript 代码放入一个文件 main.js。该文件包含我的模块声明、 Controller 、指令、过滤器和
我是一名优秀的程序员,十分优秀!