# 第2章.安全、原生功能和你的责任
---
[TOC]
作为 Web 开发者,我们通常喜欢浏览器强大的安全网络 —— 我们写的代码的风险相对较小。我们的网站在沙盒中被授予有限的能力,并且相信我们的用户喜欢使用一个大团队的工程师们构建的浏览器,可以快速的响应最新发现的安全威胁。
当使用 Electron 进行工作,重要的是要理解 Electron 并不是一个 Web 浏览器。它使你可以使用熟悉的 Web 技术构建具有丰富功能的桌面应用,但是你的代码也就有了更大的权力。JavaScript 可以访问文件系统、用户 shell 以及更多。这使你可以构建高品质的原生应用,但是固有的安全风险也被授予给你的代码的额外能力所放大。
考虑到这一点,要谨慎显示从不可信来源的任何内容构成的、但是 Electron 并没有打算处理的严重安全风险。事实上 ,最受欢迎的 Electron 应用(Atom、Slack、Visual Studio Code 等)主要显示本地内容(或可信的、安全的远程内容,不集成 Node)—— 如果你的应用从一个在线资源执行代码,确保没有恶意代码是你的责任。
## Chromium 的安全问题及升级
虽然 Electron 尽可能的努力支持新版本的 Chromium,开发者也应该意识到升级是一个重大任务 —— 涉及到手工编辑几十乃至上百个文件。考虑到现有的资源和贡献,Electron 通常不会使用最新的 Chromium 版本,也许会落后几天或几周。
我们认为升级 Chromium 组件的当前的系统,在我们可用的资源和大部分构建在框架之上的 应用的需求之间,采取一个平衡。我们肯定有兴趣听到来自在 Electron 上开发的用户的特定用例。
## 忽略以上建议
无论你从一个远程目标接收代码还是在本地执行,安全问题总是存在。作为一个例子,考虑一个远程站点被显示在一个浏览器窗口。如果一个攻击者设法改变了上述内容(无论直接攻击源代码,还是位于你的应用和实际目标之间),他们都可以执行用户机器上的原生代码。
>[warning] 任何情况下,都不应该在启用了 Node 继承时载入和执行远程代码。相反,只用本地文件(和应用程序打包在一起的)执行 Node代码。要显示远程内容,使用 webview 标签,并确保禁用了 Node 集成。
### 清单
这并不是刀枪不入的,但是至少,你应该尝试以下:
* 只显示安全(https)内容。
* 在所有显示远程内容的渲染器中禁用 Node 集成 (使用 `webPreferences`)。
* 不要禁用 `webSecurity`。禁用它也将会禁用同源策略。
* 定义一个内容安全策略,并使用约束规则(即 script-src 'self',两条规则,不执行内联 JavaScript,只加载本地脚本和资源)。
* 重写并禁用能使字符串像代码那样运行的 `eval` 。
* 不要把 allowDisplayingInsecureContent 设置为 true。
* 不要把 allowRunningInsecureContent 设置为 true。
* 不要启用 experimentalFeatures 或 experimentalCanvasFeatures ,除非你知道自己在做什么。
* 不要使用 blinkFeatures,除非你知道自己在做什么。
* WebViews:设置 nodeintegration 为 false。
* WebViews:不要使用 disablewebsecurity。
* WebViews:不要使用 allowpopups
* WebViews:不要在远程 CSS/JS 使用 insertCSS 或 executeJavaScript。
在强调一次,这个列表仅仅是减少风险,但不能清除风险。如果你的目标是显示一个网站,浏览器则是更安全的选择。
## 全局 Buffer
Node 的 Buffer 类当前是作为一个全局的类可用,甚至在 `nodeIntegration` 设置为 false 的时候。你可以从你的应用中将它删除,通过如下的 `preload` 脚本:
~~~
delete global.Buffer
~~~
删除它可能会破坏你在 preload 脚本和应用中用到的 Node 模块,因为有很多库都预期它是一个全局类而不是通过如下脚本直接引用:
~~~
const {Buffer} = require('buffer')
~~~
全局的 Buffer 在 Electron 将来的主要版本中可能会被移除。
- 索引
- 前言.关于Electron
- 第一部分 开发指南
- 第1章.平台支持
- 第2章.安全、原生功能和你的责任
- 第3章.版本说明
- 第4章.发行应用
- 第5章.Mac App商店提交指南
- 第6章.Windows商店指南
- 第7章.应用打包
- 第8章.使用Node原生模块
- 第9章.调试主进程
- 9.1.在VSCode中调试
- 9.2.在node-inspector中调试
- 第10章.使用Selenium和WebDriver
- 第11章.DevTools扩展
- 第12章.使用Pepper Flash插件
- 第13章.使用Widevine CDM插件
- 第14章.通过自动化持续集成系统进行测试
- 第15章.离屏渲染
- 第二部分 使用教程
- 第16章.快速入门
- 第17章.桌面环境集成
- 第18章.在线/离线事件探测
- 第19章.应答式编译器(REPL)
- 第三部分 API参考
- 第20章.API简介
- 第21章.进程对象
- 第22章.Chrome的命令行开关
- 第23章.环境变量
- 第24章.定制的DOM元素
- 24.1.File 对象
- 24.2.webview 标签
- 第25章.主进程模块
- 25.1.app
- 25.2.BrowserWindow
- 25.3.无框架窗口
- 第26章.渲染进程模块
- 第27章.两种进程可用的模块
- 第四部分 高级主题
- 附 FAQ
- 附 文档规范
- 附 示例用例
- 1.无边框窗口