当前位置: 首页 > news >正文

【前后端】沙箱机制

概念

  • 沙箱机制的核心目标:限制不可信代码的能力范围,保护主程序和系统安全。
  • 不是所有的沙箱机制都差不多,其实因平台、语言、目标不同而差异巨大。
    有的沙箱是通过权限声明(如浏览器扩展 Manifest)
    有的是通过系统级隔离(如 Docker、虚拟机)
    有的是通过语言级限制(如 Python 的 restricted exec)
平台/语言沙箱机制原理特点
Node.jsvm 模块、子进程、受控 API创建隔离上下文或进程灵活但不绝对安全
浏览器iframe 沙箱、CSP、Web Worker限制 DOM、网络、脚本执行安全性高但功能受限
Pythonexec + 限制 globals、Pyodide控制执行环境不推荐在生产使用
Docker容器隔离内核级命名空间和权限控制强隔离,适合服务级沙箱
操作系统级虚拟机、用户权限、SELinux系统级资源隔离安全性最高但成本大
浏览器扩展Manifest 权限声明 + 沙箱页面限制 API 和访问范围通过声明控制能力
  • 插件沙箱机制是指:在运行插件时,限制它的权限和作用范围,防止它对主程序或系统造成破坏或干扰。
    插件是外部代码,可能不可信
    插件可能会修改全局变量、污染环境、阻塞主线程
    插件可能会访问敏感资源(如文件系统、网络)

nodejs常见沙箱实现方案

  1. vm 模块(轻量沙箱)
    优点:快速、内存隔离
    缺点:无法完全阻止访问 Node API(如 require)
const vm = require('vm');
const sandbox = { console };
vm.createContext(sandbox);
vm.runInContext('console.log("Hello")', sandbox);
  1. 子进程或 Worker Threads(进程级隔离)
    优点:真正隔离内存和执行环境
    缺点:通信复杂、性能开销略高
const { fork } = require('child_process');
const child = fork('./plugin.js');
  1. 受控 API 注入(逻辑沙箱)
    优点:简单易控
    缺点:插件仍在主进程运行,无法防止恶意代码
plugin.run({ log, renderMarkdown, getConfig });

插件的沙箱机制

  • 判断是否做到位
    插件是否运行在主进程中?是否可以访问 process, fs, require 等?
    插件是否可以修改主程序的变量或状态?
    插件是否只能使用你提供的 API(比如 renderMarkdown, log, getConfig)?
    插件出错是否会影响整个 CLI 工具运行?
  • 实现
    推荐:子进程执行 使用 child_process.fork() 或 worker_threads 运行插件代码 隔离内存和执行环境
    限制多:VM 虚拟机模块使用 Node.js 的 vm 模块运行插件代码,限制访问变量
const vm = require('vm');
const code = fs.readFileSync(pluginPath, 'utf-8');
const sandbox = { module: {}, console };
vm.createContext(sandbox);
vm.runInContext(code, sandbox);

最常见:限制 API 注入 插件只接收你提供的 API,不暴露主程序对象

const plugin = require(pluginPath);
const sandboxAPI = {renderMarkdown,log,getConfig
};
plugin.run(sandboxAPI); // 插件只能用你给的 API

高级方式,适用于大型系统:权限控制 插件声明需要的权限(如读文件、写文件),主程序决定是否允许

实战:插件运行器,支持沙箱执行、错误隔离、权限声明

http://www.dtcms.com/a/286592.html

相关文章:

  • gcc 源码分析:从IR-RTL 到汇编输出
  • C++ 程序 AddressSanitizer:DEADLYSIGNAL
  • 自动化面试题
  • spring-cloud微服务部署转单体部署-feign直连调用
  • 磁悬浮轴承系统中由不平衡力引发的恶性循环机制深度解析
  • 初探:C语言FILE结构之文件描述符与缓冲区的实现原理
  • 前端 SSE 实战应用:用最简单的方式实现实时推送
  • Python基础④-装饰器、迭代器及常用函数篇
  • 在断网情况下,网线直接连接 Windows 笔记本和 Ubuntu 服务器进行数据传输
  • 高性能数据库-Redis详解
  • verilog tb文件 美化terminal输出
  • Webpack 项目构建优化详解
  • 雪豹大模型驱动效率革命 华鼎冷链科技重构餐饮供应链神经网络
  • 进程 线程 并发 并行
  • 安达发|从救火到未雨绸缪:APS生产计划排产软件重塑制造业“危机免疫力“
  • 2025年6月电子学会全国青少年软件编程等级考试(Python一级)真题及答案
  • 添加DNS解析记录时,提醒记录冲突是怎么回事?
  • Python练习2-格式化输出基本数据类型及变量的详细使用
  • Aqara 携手西门子西碳迹SiTANJI,发布亚马逊 CPF 绿标解决方案标杆案例
  • 根据用户id自动切换表查询
  • c语言笔记---结构体
  • 浏览器元素定位工具-项目源码免费领取
  • 萤石摄像头C++SDK应用实例
  • 前端笔记之 async/await 异步编程详解
  • 面试高频题 力扣 695.岛屿的最大面积 洪水灌溉(FloodFill) 深度优先遍历 暴力搜索 C++解题思路 每日一题
  • Python网络爬虫之selenium库
  • 第九章 基础设施更新工程
  • 语音控制操作板:人机交互的未来趋势
  • 企业级异常处理方案:Spring Boot自定义异常全局拦截实战
  • 多线程的认识