Merge pull request #7142 from electron/require-buffer

Require Buffer explicitly instead of relying on global
This commit is contained in:
Cheng Zhao 2016-09-09 19:52:53 +09:00 committed by GitHub
commit 932b6dc0cf
9 changed files with 54 additions and 1 deletions

View file

@ -36,6 +36,7 @@ things on top of Electron. Pull requests and contributions supporting this
effort are always very welcome.
## Ignoring Above Advice
A security issue exists whenever you receive code from a remote destination and
execute it locally. As an example, consider a remote website being displayed
inside a browser window. If an attacker somehow manages to change said content
@ -49,6 +50,7 @@ your application) to execute Node code. To display remote content, use the
`webview` tag and make sure to disable the `nodeIntegration`.
#### Checklist
This is not bulletproof, but at the least, you should attempt the following:
* Only display secure (https) content
@ -71,3 +73,22 @@ This is not bulletproof, but at the least, you should attempt the following:
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.
## Buffer Global
Node's [Buffer](https://nodejs.org/api/buffer.html) class is currently available
as a global even when `nodeIntegration` is set to `false`. You can delete
this in your app by doing the following in your `preload` script:
```js
delete global.Buffer
```
Deleting it may break Node modules used in your preload script and app since
many libraries expect it to be a global instead of requiring it directly via:
```js
const {Buffer} = require('buffer')
```
The `Buffer` global may be removed in future major versions of Electron.

View file

@ -2,6 +2,7 @@ const {app, ipcMain, webContents, BrowserWindow} = require('electron')
const {getAllWebContents} = process.atomBinding('web_contents')
const renderProcessPreferences = process.atomBinding('render_process_preferences').forAllWebContents()
const {Buffer} = require('buffer')
const fs = require('fs')
const path = require('path')
const url = require('url')

View file

@ -1,5 +1,6 @@
'use strict'
const {Buffer} = require('buffer')
const fs = require('fs')
const path = require('path')
const util = require('util')

View file

@ -1,5 +1,6 @@
'use strict'
const {Buffer} = require('buffer')
const electron = require('electron')
const v8Util = process.atomBinding('v8_util')
const {ipcMain, isPromise, webContents} = electron

View file

@ -1,5 +1,6 @@
(function () {
const asar = process.binding('atom_common_asar')
const {Buffer} = require('buffer')
const childProcess = require('child_process')
const path = require('path')
const util = require('util')

View file

@ -1,5 +1,6 @@
'use strict'
const {Buffer} = require('buffer')
const v8Util = process.atomBinding('v8_util')
const {ipcRenderer, isPromise, CallbacksRegistry} = require('electron')

View file

@ -123,7 +123,7 @@ if (nodeIntegration === 'true') {
delete global.process
delete global.setImmediate
delete global.clearImmediate
return delete global.global
delete global.global
})
}

View file

@ -542,6 +542,22 @@ describe('browser-window module', function () {
})
w.loadURL('file://' + path.join(fixtures, 'api', 'preload.html'))
})
it('can successfully delete the Buffer global', function (done) {
var preload = path.join(fixtures, 'module', 'delete-buffer.js')
ipcMain.once('answer', function (event, test) {
assert.equal(test.toString(), 'buffer')
done()
})
w.destroy()
w = new BrowserWindow({
show: false,
webPreferences: {
preload: preload
}
})
w.loadURL('file://' + path.join(fixtures, 'api', 'preload.html'))
})
})
describe('"node-integration" option', function () {

11
spec/fixtures/module/delete-buffer.js vendored Normal file
View file

@ -0,0 +1,11 @@
const path = require('path')
const {remote} = require('electron')
const {Buffer} = window
delete window.Buffer
delete global.Buffer
// Test that remote.js doesn't use Buffer global
remote.require(path.join(__dirname, 'print_name.js')).echo(new Buffer('bar'))
window.test = new Buffer('buffer')