🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 第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 将来的主要版本中可能会被移除。