Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
Electron で nodeIntegration: false にする方法

公式では、未来的に nodeIntegration: false にすることを推奨しています

理由は、レンダラプロセスで Node.js が実行できてしまうと、XSS発生時に脆弱性が増すためです

例えば、fs モジュールを使ってあなたのローカルファイルを取得して、どこかに送信することも可能ですし、ファイルを全て消し去ることもできてしまいます

nodeIntegration: false にする方法


メインプロセスで nodeIntegration: false にする

 mainWindow = new BrowserWindow({
    webPreferences: {
      // レンダラープロセスで Node.js 使えないようにする (XSS対策)
      nodeIntegration: false,
      // preloadスクリプトを, app.htmlとは別のJavaScriptコンテキストで実行するかどうか
      // false にしないと、window object を共有できない
      contextIsolation: false,
      // process や Electron を windowオブジェクト に保存する処理。フルパスの指定が必要
      preload: path.join(__dirname, '/preload.js'),

preload.js を用意

 * preload.js
 * process や Electron を windowオブジェクト に保存する処理
const electron = require('electron');

process.once('loaded', () => {
  // console.log('---- preload.js loaded ----');
  global.process = process;
  global.electron = electron;
  global.module = module;

global に持たせたものは、レンダラプロセスにて、window オブジェクトに入るので

require('electron')window.electron に書き換える


target: 'web' にする

もし、従来の方式である target:'electron-renderer' にしていた場合は、 bundle.js 内で require するコードが生成されるので、

Uncaught ReferenceError: require is not defined エラーが発生する

  entry: [

  output: {

  target: 'web',
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.