佛山高端网站设计,如果制作一个自己的网站,哪里可以发广告,深圳建设银行官方网站背景#xff1a;
electron大家平时为了方便使用#xff0c;或是一些网上demo的引导#xff0c;会让渲染进程的业务界面支持直接使用nodejs#xff0c;这种开发方式有一定的安全隐患#xff0c;如果业务界面因为xss之类的漏洞被注入其他代码#xff0c;危害非常大#x…背景
electron大家平时为了方便使用或是一些网上demo的引导会让渲染进程的业务界面支持直接使用nodejs这种开发方式有一定的安全隐患如果业务界面因为xss之类的漏洞被注入其他代码危害非常大属于最高等级的安全问题。那么怎样更好的避免发生这种问题呢 一.禁止渲染进程页面直接使用nodejs,webPreferences这么配置
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-isolationnodeIntegration: true,//webviewTag: true,contextIsolation: true,//隔离},});
二.通过preload配置暴露允许使用调用的接口preload配置的配置方式如上代码内容如下例子
import { contextBridge, ipcRenderer } from electroncontextBridge.exposeInMainWorld(electronAPI, {openFile: () ipcRenderer.invoke(dialog:openFile)
})
在渲染进程界面采用window.electronAPI.openFile()方式调用,为了让渲染进程足够安全建议设计这里的接口尽量做到仅暴露必要函数和参数不要直接把诸如electron对象暴露给页面界面这种事情干多了这个安全隔离的意义就会逐渐消失。
渲染进程与preload通讯的另外一种方式通过postmessage举例
preload.js
window.onmessage (ev) {ev.data.payload removeLoading removeLoading();
};
渲染页js
postMessage({ payload: removeLoading }, *);
这种方式相比第一种更加安全一点暴露的信息更加隐蔽但使用起来比较麻烦可能需要进一步封装
三其他问答
1.preload.js在跳转到新地址后还会不会存在
答会每次发生跳转preload.js都会重新加载进来跟普通加载js一样所以这个js的变量并非持久化的
2.采用exposeInMainWorld暴露的接口需要注意什么
答exposeInMainWorld暴露的接口是拷贝当前对象的属性并不是真的把属性的引用暴露出来例如暴露的属性是一个 new EventEmitter对象你想在业务界面访问这个属性的on方法是访问不到的。
3.preload跟主进程通讯方式
方式一invoke和handle的组合
//preload.js
let a ipcRenderer.invoke(xxx)//main.js
ipcMain.handle(xxx, async (){
return 123
})方式二on和send的组合
// 在主进程中.
const { ipcMain } require(electron)
ipcMain.on(asynchronous-message, (event, arg) {console.log(arg) // prints pingevent.reply(asynchronous-reply, pong)
})ipcMain.on(synchronous-message, (event, arg) {console.log(arg) // prints pingevent.returnValue pong
})
/在渲染器进程 (网页) 中。
const { ipcRenderer } require(electron)
console.log(ipcRenderer.sendSync(synchronous-message, ping)) // prints pongipcRenderer.on(asynchronous-reply, (event, arg) {console.log(arg) // prints pong
})
ipcRenderer.send(asynchronous-message, ping)