# 第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.無邊框窗口