上次开会项目开会提到了使用electron安全性的问题:
是否要禁用Node.js集成?是目前所要考虑的问题。
跨站脚本(XSS)攻击很常见,攻击者跳过渲染进程并在用户电脑上执行恶意代码,危害是非常大的。禁用Node.js集成有助于防止XSS攻击升级为“远程代码执行”(RCE)攻击。
怎么解决Node.js集成的问题?
当禁用Node.js集成时,你可以暴露API给你的站点,以使用Node.js的模块功能或特性。预加载脚本依然可以使用require等Node.js特性,以使开发者可以暴露自定义API给远程加载内容。
const mainWindow = new BrowserWindow({ webPreferences: { //网页功能的设置 nodeIntegration: false, //是否完整的支持 node. 默认值为true nodeIntegrationInWorker: false,// 是否在Web工作器中启用了Node集成 preload: './preload.js' //在页面运行其他脚本之前预先加载指定的脚本 无论页面是否集成Node, 此脚本都可以访问所有Node API 脚本路径为文件的绝对路径 } })
下面结合新零售业务,对于node – serialport怎么处理的?
Electron主进程: mainWindow = new BrowserWindow({ 800, height: 600, webPreferences: { nodeIntegration: false, nodeIntegrationInWorker: false preload: path.join(__dirname, 'preload.js') } })
暴露API给站点(preload.js): const serialport = require('serialport'); let nav = { serialport:serialport } global.nav = nav;
站点(web业务)要使用的: const contr = document.getElementById('port') const serialport = window.nav.serialport; if(!serialport) return; serialport.list((err, ports) => { for (let item of ports) { var div = document.createElement('div') div.innerHTML = item.comName contr.appendChild(div) } console.log(ports); });
在项目中遇到的具体问题就是如此,这里做下项目总结。后续会持续记录。