electron这样使用更安全

背景:

electron大家平时为了方便使用,或是一些网上demo的引导,会让渲染进程的业务界面支持直接使用nodejs,这种开发方式有一定的安全隐患,如果业务界面因为xss之类的漏洞被注入其他代码,危害非常大,属于最高等级的安全问题。那么怎样更好的避免发生这种问题呢?

一.禁止渲染进程页面直接使用nodejs,webPreferences这么配置

javascript 复制代码
win = new BrowserWindow({
    webPreferences: {
      preload:"./preload.js",
      // Warning: Enable nodeIntegration and disable contextIsolation is not secure in production
      // Consider using contextBridge.exposeInMainWorld
      // Read more on https://www.electronjs.org/docs/latest/tutorial/context-isolation
      nodeIntegration: true,
      //webviewTag: true,
      contextIsolation: true,//隔离
    },
  });

二.通过preload配置,暴露允许使用调用的接口,preload配置的配置方式如上代码,内容如下例子:

javascript 复制代码
import { contextBridge, ipcRenderer } from 'electron'

contextBridge.exposeInMainWorld('electronAPI', {
  openFile: () => ipcRenderer.invoke('dialog:openFile')
})

在渲染进程界面采用window.electronAPI.openFile()方式调用,为了让渲染进程足够安全,建议设计这里的接口尽量做到仅暴露必要函数和参数,不要直接把诸如electron对象暴露给页面界面,这种事情干多了,这个安全隔离的意义就会逐渐消失。

渲染进程与preload通讯的另外一种方式,通过postmessage,举例

preload.js

javascript 复制代码
window.onmessage = (ev) => {
  ev.data.payload === "removeLoading" && removeLoading();
};

渲染页js

javascript 复制代码
postMessage({ payload: "removeLoading" }, "*");

这种方式相比第一种更加安全一点(暴露的信息更加隐蔽),但使用起来比较麻烦,可能需要进一步封装

三:其他问答:

1.preload.js在跳转到新地址后还会不会存在?

答:会,每次发生跳转preload.js都会重新加载进来,跟普通加载js一样,所以这个js的变量并非持久化的

2.preload跟主进程通讯方式

方式一:invoke和handle的组合

javascript 复制代码
//preload.js
let a = ipcRenderer.invoke('xxx')

//main.js
ipcMain.handle('xxx', async ()=>{
return "123"
})

方式二:on和send的组合

javascript 复制代码
// 在主进程中.
const { ipcMain } = require('electron')
ipcMain.on('asynchronous-message', (event, arg) => {
  console.log(arg) // prints "ping"
  event.reply('asynchronous-reply', 'pong')
})

ipcMain.on('synchronous-message', (event, arg) => {
  console.log(arg) // prints "ping"
  event.returnValue = 'pong'
})
javascript 复制代码
/在渲染器进程 (网页) 中。
const { ipcRenderer } = require('electron')
console.log(ipcRenderer.sendSync('synchronous-message', 'ping')) // prints "pong"

ipcRenderer.on('asynchronous-reply', (event, arg) => {
  console.log(arg) // prints "pong"
})
ipcRenderer.send('asynchronous-message', 'ping')
相关推荐
虹科网络安全2 分钟前
艾体宝新闻|从 SQL 注入到服务器接管:CVE-2026-57517 暴露 Web 管理面板的供应链与安全编码风险
服务器·前端·sql
糖果店的幽灵8 分钟前
langgraph的四种state解析
java·前端·javascript·langgraph
顺颂时绥_122 分钟前
前端大图片压缩与安卓/苹果设备矫正实践
前端
Csvn24 分钟前
JSON.parse 大数精度丢失:一个让前后端互相甩锅的 Bug
前端
Helen_cai43 分钟前
OpenHarmony 项目统一全局样式、尺寸、色彩主题封装 ThemeUtil(API23)
开发语言·前端·javascript·华为·harmonyos
郑州光合科技余经理44 分钟前
家政O2O平台解析:从0搭建上门预约小程序解决方案
android·java·开发语言·前端·小程序·架构·php
小徐_23331 小时前
AI 写 wot-ui 总在猜 API?我们把 Skills、MCP 和 CLI 都配好了
前端·uni-app·ai编程
winfredzhang1 小时前
用 wxPython + ECharts + 阿里矢量地图,做一个可离线兜底的上海雨量看板
前端·javascript·echarts
索西引擎1 小时前
【React】Immer.js 在现代 Redux 生态中的角色:不可变性保障的工程化实现与开发体验优化
前端·javascript·react.js
kisshyshy1 小时前
《川剧变脸 × React 状态管理?我在浏览器里跑了个端侧大模型》
前端·react.js·架构