You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Electron应用中限制目录访问的技术方案咨询

解决方案

1. 自定义协议映射指定子目录(推荐)

通过Electron的protocol模块注册自定义协议,将目标子目录(如Sandbox/)映射为该协议的根路径,让iframe内代码只能访问该协议下的资源,无法突破到上级目录。

实现步骤:

  • 主进程中注册协议并添加路径校验:
const { app, protocol } = require('electron');
const path = require('path');

app.whenReady().then(() => {
  protocol.registerFileProtocol('sandbox', (request, callback) => {
    const url = request.url.replace('sandbox://', '');
    const targetPath = path.join(__dirname, 'Sandbox', url);
    
    // 校验路径是否在Sandbox目录内,拦截路径遍历攻击
    const relativePath = path.relative(path.join(__dirname, 'Sandbox'), targetPath);
    if (relativePath.startsWith('..') || path.isAbsolute(relativePath)) {
      callback({ error: -6 }); // 返回文件不存在错误
      return;
    }
    callback({ path: targetPath });
  });
});
  • iframe配置(无需allow-same-origin):
<iframe src="sandbox://index.html" sandbox="allow-scripts"></iframe>

把jQuery、TinyMCE等工具放在Sandbox目录下,iframe内代码通过sandbox://协议访问这些资源,尝试读取上级目录文件会被拦截。

2. 预加载脚本注入工具库

若不想把工具库放在Sandbox目录,可通过预加载脚本将所需工具注入iframe全局作用域,同时保持沙箱隔离(不设置allow-same-origin)。

实现步骤:

  • 主进程配置webPreferences:
const { BrowserWindow } = require('electron');
const path = require('path');

const mainWindow = new BrowserWindow({
  webPreferences: {
    sandbox: true,
    preload: path.join(__dirname, 'iframe-preload.js')
  }
});
  • 编写预加载脚本iframe-preload.js:
const { contextBridge } = require('electron');
const $ = require('jquery'); // 需提前安装jquery包

// 安全暴露jQuery到iframe全局
contextBridge.exposeInMainWorld('jQuery', $);

// 同理处理TinyMCE:比如加载本地TinyMCE文件后暴露API
  • iframe配置:
<iframe src="Sandbox/index.html" sandbox="allow-scripts"></iframe>

iframe内不可信代码可直接调用window.jQuery,无需访问外部文件,同时无法突破沙箱权限。

3. 结合Electron沙箱模式强化隔离

启用Electron的sandbox模式(主进程webPreferences.sandbox=true),让iframe运行在更严格的隔离环境中,再配合自定义协议或预加载提供必要资源。注意启用沙箱后,预加载脚本仅能使用Electron受限API子集,必须通过contextBridge安全暴露内容。

关键注意事项
  • 绝对不要给不可信代码的iframe设置allow-same-origin,这会完全破坏沙箱隔离,让iframe获得和主窗口一致的文件系统访问权限。
  • 自定义协议必须添加路径校验逻辑,防止通过../等手段遍历Sandbox外的资源。
  • 预加载脚本仅暴露必要API,避免向不可信代码泄露敏感能力。

内容的提问来源于stack exchange,提问作者CJ Macbeth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 15:40:37