0

0

Electron应用中如何保护主进程和渲染进程的XML文件交互

幻夢星雲

幻夢星雲

发布时间:2026-02-05 08:10:02

|

513人浏览过

|

来源于php中文网

原创

不能直接用 fs.readFile 在渲染进程读 XML,因 Electron 渲染进程默认禁用 Node.js 模块,require('fs') 不可用;强行启用会破坏沙箱安全,应通过 ipcRenderer.invoke 调用主进程经白名单校验和安全解析的 xml:read 接口。

electron应用中如何保护主进程和渲染进程的xml文件交互

为什么不能直接用 fs.readFile 在渲染进程读 XML

Electron 渲染进程默认运行在沙箱环境(即使没显式开启 contextIsolation: true),require('fs') 也根本不可用。强行注入 Node.js 模块或关闭 nodeIntegration 都会大幅削弱安全边界,属于高危操作。

常见错误现象包括:ReferenceError: require is not definedfs is not defined,或更隐蔽的——XML 文件被意外写入恶意内容后,主进程未经校验直接解析,触发 XXE 或路径遍历。

  • 渲染进程只能通过 ipcRenderer 发起受控请求
  • 主进程必须对所有传入路径做白名单校验,禁止用户输入直接拼接 fs 调用
  • XML 解析必须禁用外部实体(libxmljs 默认启用,fast-xml-parser 默认禁用)

如何用 ipcMain.handle 安全暴露 XML 读取能力

主进程应只暴露最小必要接口,且每个调用都需验证路径合法性与文件扩展名。不建议把整个 fs 封装成通用 API。

const { app, ipcMain } = require('electron');
const path = require('path');
const fs = require('fs').promises;
const xmlParser = require('fast-xml-parser');

// 白名单:只允许读取 resources/xml/ 下的 .xml 文件
const ALLOWED_XML_DIR = path.join(app.getAppPath(), 'resources', 'xml');

ipcMain.handle('xml:read', async (event, filename) => {
  // 1. 拒绝路径遍历
  if (filename.includes('..') || filename.startsWith('/')) {
    throw new Error('Invalid filename');
  }
  const fullPath = path.join(ALLOWED_XML_DIR, filename);
  
  // 2. 确保解析前路径仍在白名单内
  const resolved = await fs.realpath(fullPath);
  if (!resolved.startsWith(ALLOWED_XML_DIR)) {
    throw new Error('Access denied');
  }
  
  // 3. 检查扩展名
  if (path.extname(fullPath) !== '.xml') {
    throw new Error('Only .xml files allowed');
  }

  try {
    const content = await fs.readFile(fullPath, 'utf8');
    // 4. 使用安全解析器(不解析 DTD / 外部实体)
    const isValid = xmlParser.validate(content);
    if (isValid !== true) throw new Error('Invalid XML structure');
    
    return xmlParser.parse(content, {
      ignoreAttributes: false,
      ignoreNameSpace: true,
      allowBooleanAttributes: false,
      parseNodeValue: true,
      parseAttributeValue: true,
      trimValues: true
    });
  } catch (err) {
    throw new Error(`Failed to read/parse ${filename}: ${err.message}`);
  }
});

渲染进程中如何调用并处理返回结果

使用 ipcRenderer.invoke 替代 send+on,避免竞态和未处理 promise。注意:返回的是解析后的 JS 对象,不是原始字符串 —— 这意味着你无法再用 DOMParser 处理命名空间等高级特性,但换来的是安全性。

达芬奇
达芬奇

达芬奇——你的AI创作大师

下载
  • 不要在渲染进程里拼接用户输入作为 filename 参数,应从预定义列表中选择
  • 捕获 invoke 的 rejection,避免未处理异常导致界面卡死
  • 若需保留原始 XML 字符串(例如用于 diff 或重写),主进程应额外提供 xml:raw-read 接口,且返回前仍需校验和长度限制(如 ≤ 512KB)
// 渲染进程(preload.js 中已上下文隔离)
const { ipcRenderer } = require('electron');

async function loadConfigXml() {
  try {
    // filename 是前端可控但受限的值,比如来自下拉菜单选项 ['app-config.xml', 'theme-default.xml']
    const data = await ipcRenderer.invoke('xml:read', 'app-config.xml');
    console.log('Parsed config:', data);
    return data;
  } catch (err) {
    console.error('Failed to load XML:', err);
    alert('配置加载失败,请检查应用完整性');
  }
}

写 XML 文件时更要谨慎:主进程不能信任任何渲染进程传来的结构

写操作比读更危险。即使你校验了路径,也不能直接把渲染进程传来的 JS 对象交给 xmlBuilder 序列化 —— 因为对象可能含循环引用、非法字符、超长文本或构造好的恶意实体。

  • 主进程应定义严格 schema(如用 zodajv 校验),只接受明确字段
  • 序列化必须使用无副作用的生成器(如 xmlbuilder2),禁用 allowDoctypeencoding 动态设置
  • 写入前先 fs.stat 检查目标目录是否存在且为目录,防止覆盖关键文件
  • 写入后建议用 fs.chmod 设为只读(仅限桌面端本地配置场景)

最常被忽略的一点:XML 文件若用于存储用户偏好,其路径往往硬编码在主进程中;一旦攻击者通过原型污染或 IPC 消息伪造绕过校验,就可能写入 ../package.json../../main.js —— 所以白名单路径 + realpath 校验不是可选项,是必选项。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

428

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

541

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

313

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

78

2025.09.10

require的用法
require的用法

require的用法有引入模块、导入类或方法、执行特定任务。想了解更多require的相关内容,可以阅读本专题下面的文章。

468

2023.11.27

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1914

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2096

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1099

2024.11.28

java连接字符串方法汇总
java连接字符串方法汇总

本专题整合了java连接字符串教程合集,阅读专题下面的文章了解更多详细操作。

7

2026.02.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.8万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号