我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

Deno Sandbox 安全沙箱实战指南:基于 autoskills 技能库的 @deno/sandbox 完整上手

Deno Sandbox 安全沙箱实战指南:基于 autoskills 技能库的 @deno/sandbox 完整上手 【免费下载链接】autoskillsOne command. Your entire AI skill stack. Installed.项目地址https://gitcode.com/gh_mirrors/au/autoskills点击查看免费下载Deno Sandbox 提供基于 Firecracker microVM 的隔离代码执行环境用于安全运行不可信的用户代码、AI 生成代码以及构建多租户代码执行平台。本文以 autoskills 技能库 中的deno-sandbox技能文档为主体结合仓库源码与注册表配置系统讲解deno/sandboxSDK 的安装、生命周期管理、进程控制、流式 I/O 以及四类实战模式并梳理常见误区和安全边界帮助读者直接落地一套可复用的沙箱执行方案。一、Deno Sandbox 是什么Deno Sandboxes 为运行不可信代码提供安全、隔离的运行环境。每个沙箱都运行在独立的 Linux microVM 中——底层采用Firecracker与 AWS Lambda 相同的虚拟化技术——拥有独立的文件系统、网络和进程空间。这种设计使其天然适合以下几类场景安全运行用户提交的代码如在线评测、代码分享平台执行 AI 生成的代码Agent 工具调用、代码生成验证构建代码游乐场Playground类产品创建多租户代码执行环境在隔离环境中运行自动化测试从底层看每个沙箱相当于一台轻量级虚拟机内核、文件系统、网络栈、进程表全部独立宿主机与沙箱之间不存在共享内存或文件句柄恶意代码即使获得 root 权限也无法逃逸到宿主机。适用范围边界该技能只适用于deno/sandbox相关的问题技能文档明确规定了以下边界规则如果用户询问的是Docker 容器、Node.js vm2/vm、Web Workers、AWS Lambda 隔离或其他任何隔离技术应直接使用对应技术作答不要建议改用 Deno Sandbox。在回答其他隔离技术问题时不要出现deno/sandbox导入、Sandbox.create()或sandbox.spawn()等代码。只有当用户明确询问 Deno Sandbox或正在 Deno 项目中构建代码执行功能时才推荐使用它。二、在 autoskills 技能库中的位置与校验deno-sandbox技能由 denoland 官方维护MIT 许可已被收录进 autoskills 的技能注册表。仓库中的注册表清单 index.json 记录其来源为denoland/skills/deno-sandbox包含单个SKILL.md文件并带有sha256文件哈希、bundleHash整体包哈希以及approved已审核通过状态。在技术栈检测层面skills-map.ts 将deno-sandbox关联到deno技术组检测依据是项目中存在deno.json、deno.jsonc或deno.lock配置文件。也就是说当 autoskills 扫描到 Deno 项目时会自动把denoland/skills/deno-sandbox列入待安装技能候选。安装时installer.ts 会先校验本地注册表文件的sha256哈希与bundleHash校验通过后把技能复制到项目下的.agents/skills/deno-sandbox目录再通过符号链接暴露给 Cursor、Claude Code 等 Agent 技能目录并写入skills-lock.json锁定版本。这条「哈希校验 → 本地复制 → 符号链接 → 锁定」的流水线保证了每次安装的技能内容与官方审核通过的版本完全一致。三、快速开始安装在 Deno 项目中通过 JSR 添加依赖deno add jsr:deno/sandbox基础用法创建沙箱并执行一条命令是最直接的上手方式import { Sandbox } from deno/sandbox; // Create a sandbox (auto-disposed when scope ends) await using sandbox await Sandbox.create(); // Run a command const child await sandbox.spawn(echo, { args: [Hello from sandbox!] }); const output await child.output(); console.log(new TextDecoder().decode(output.stdout)); // Output: Hello from sandbox!四、核心概念沙箱生命周期沙箱属于必须在使用完毕后释放的资源务必始终使用await using实现自动清理await using sandbox await Sandbox.create(); // Sandbox is automatically destroyed when this scope ends这是技能文档反复强调的关键约定永远不要写出不带await using的const sandbox await Sandbox.create()也不要展示手动释放的替代写法。await using是 TypeScript 显式资源管理Explicit Resource Management语法作用域结束时沙箱对应的 microVM 会被自动销毁从而避免资源泄漏和宿主机上堆积僵尸微虚拟机。运行进程spawn方法在沙箱内部执行命令const child await sandbox.spawn(deno, { args: [run, script.ts], stdin: piped, // Enable stdin stdout: piped, // Capture stdout stderr: piped // Capture stderr }); // Wait for completion and get output const output await child.output(); console.log(Exit code:, output.code); console.log(Stdout:, new TextDecoder().decode(output.stdout)); console.log(Stderr:, new TextDecoder().decode(output.stderr));注意stdin/stdout/stderr三个选项设为piped意味着把子进程的对应流通过管道接到宿主侧供后续读写如果不需要捕获某一路输出可以不设该选项。流式 I/O对于交互式进程或长时间运行的命令采用流式读写const child await sandbox.spawn(deno, { args: [repl], stdin: piped, stdout: piped }); // Write to stdin const writer child.stdin!.getWriter(); await writer.write(new TextEncoder().encode(console.log(Hello)\n)); await writer.close(); // Read from stdout const reader child.stdout!.getReader(); while (true) { const { done, value } await reader.read(); if (done) break; console.log(new TextDecoder().decode(value)); }stdin/stdout暴露为标准的 Web Streams APIgetWriter()/getReader()与 Deno 及浏览器的流约定一致便于对接 REPL、交互式 CLI 或持续输出的长任务。终止进程const child await sandbox.spawn(sleep, { args: [60] }); // Kill with SIGTERM (default) await child.kill(); // Or with specific signal await child.kill(SIGKILL); // Wait for exit const status await child.status; console.log(Exited with signal:, status.signal);kill()默认发送SIGTERM也可显式传入SIGKILL等信号之后通过child.status读取退出信号。超时管理通常依赖这套机制见「常见错误」章节。五、常见模式模式一安全运行用户代码把用户提交的代码写入沙箱文件系统再以最小权限执行import { Sandbox } from deno/sandbox; async function runUserCode(code: string): Promisestring { await using sandbox await Sandbox.create(); // Write user code to a file in the sandbox await sandbox.fs.writeFile(/tmp/user_code.ts, code); // Run with restricted permissions const child await sandbox.spawn(deno, { args: [ run, --allow-none, // No permissions /tmp/user_code.ts ], stdout: piped, stderr: piped }); const output await child.output(); if (output.code ! 0) { throw new Error(new TextDecoder().decode(output.stderr)); } return new TextDecoder().decode(output.stdout); }这里的关键是--allow-noneDeno 运行时默认不允许任何权限用户代码无法读取宿主文件、访问网络或执行系统调用所有越权行为都会直接失败而沙箱本身又提供了进程级、网络级的第二道隔离。模式二代码游乐场Playground带执行耗时统计的完整游乐场执行器import { Sandbox } from deno/sandbox; interface ExecutionResult { success: boolean; output: string; error?: string; executionTime: number; } async function executePlayground(code: string): PromiseExecutionResult { const start performance.now(); await using sandbox await Sandbox.create(); await sandbox.fs.writeFile(/playground/main.ts, code); const child await sandbox.spawn(deno, { args: [run, --allow-net, /playground/main.ts], stdout: piped, stderr: piped }); const output await child.output(); const executionTime performance.now() - start; return { success: output.code 0, output: new TextDecoder().decode(output.stdout), error: output.code ! 0 ? new TextDecoder().decode(output.stderr) : undefined, executionTime }; }此模式按需放宽权限--allow-net同时把退出码、标准输出、标准错误和执行耗时封装成结构化结果可直接对接前端游乐场 UI。模式三AI Agent 工具执行AI Agent 场景下工具代码与输入数据需要在沙箱内完成「注入输入 → 动态导入 → 序列化输出」的闭环import { Sandbox } from deno/sandbox; async function executeAgentTool(toolCode: string, input: unknown): Promiseunknown { await using sandbox await Sandbox.create(); // Create a wrapper that handles input/output const wrapper const input ${JSON.stringify(input)}; const tool await import(/tool.ts); const result await tool.default(input); console.log(JSON.stringify(result)); ; await sandbox.fs.writeFile(/tool.ts, toolCode); await sandbox.fs.writeFile(/run.ts, wrapper); const child await sandbox.spawn(deno, { args: [run, --allow-net, /run.ts], stdout: piped, stderr: piped }); const output await child.output(); if (output.code ! 0) { throw new Error(new TextDecoder().decode(output.stderr)); } return JSON.parse(new TextDecoder().decode(output.stdout)); }该模式将输入通过JSON.stringify注入包装脚本、把工具实现写入/tool.ts、再用import(/tool.ts)动态加载最后以JSON.parse还原输出。整体上输入、代码、输出三者全部在沙箱内流转宿主侧只拿到序列化结果是 Agent 工具沙箱化的标准模板。六、沙箱特性资源配置默认规格2 vCPU、512MB 内存、10GB 磁盘启动时间低于 200msmicroVM 级别的秒级内冷启动适合按需创建、用完即弃沙箱内置内容每个沙箱自带TypeScript/JavaScript 运行时Deno完整的 Linux 环境网络访问可被限制临时文件系统安全特性Firecracker microVM——与 AWS Lambda 相同的虚拟化技术完全隔离——独立的内核、文件系统、网络无数据泄漏——沙箱无法访问宿主系统强制策略——可控制出站连接沙箱是「双保险」设计microVM 提供硬件级隔离边界Deno 权限模型--allow-none/--allow-net/--allow-all在进程内进一步收缩能力面二者叠加形成纵深防御。七、部署到 Deno Deploy沙箱可以直接部署到 Deno Deploy 云端deno deploy --proddeno/sandboxSDK 在 Deno Deploy 环境中开箱即用本地开发与云端行为一致因此代码游乐场、Agent 工具等服务可以无缝托管到边缘平台而无需修改沙箱代码。八、API 参考要查看完整 API运行deno doc jsr:deno/sandbox核心类类职责Sandbox创建与管理沙箱的主类ChildProcess表示沙箱内正在运行的进程Client管理 Deploy 资源应用、卷等九、速查表任务代码创建沙箱await using sandbox await Sandbox.create()运行命令sandbox.spawn(cmd, { args: [...] })获取输出const output await child.output()写文件await sandbox.fs.writeFile(path, content)读文件await sandbox.fs.readFile(path)终止进程await child.kill()检查状态const status await child.status十、常见错误与规避1. 忘记自动释放// ❌ Wrong - always use await using for sandbox creation // Never write: const sandbox await Sandbox.create() without await using // ✅ Correct - use await using for automatic cleanup await using sandbox await Sandbox.create(); await sandbox.spawn(echo, { args: [hello] }); // sandbox automatically disposed when scope ends2. 给用户代码过多权限// ❌ Wrong - gives untrusted code full access const child await sandbox.spawn(deno, { args: [run, --allow-all, /tmp/user_code.ts] }); // ✅ Correct - restrict permissions to whats needed const child await sandbox.spawn(deno, { args: [run, --allow-none, /tmp/user_code.ts] // No permissions }); // Or if network is truly needed: const child await sandbox.spawn(deno, { args: [run, --allow-net, /tmp/user_code.ts] // Only network });权限遵循最小化原则默认--allow-none确有网络需求时只放开--allow-net绝不给不可信代码--allow-all。3. 没有正确处理进程输出// ❌ Wrong - forgetting to pipe stdout/stderr const child await sandbox.spawn(deno, { args: [run, script.ts] }); const output await child.output(); // output.stdout is empty because we didnt pipe it! // ✅ Correct - pipe the streams you need const child await sandbox.spawn(deno, { args: [run, script.ts], stdout: piped, stderr: piped }); const output await child.output(); console.log(new TextDecoder().decode(output.stdout));4. 不给用户代码设置超时// ❌ Wrong - user code could run forever const child await sandbox.spawn(deno, { args: [run, /tmp/user_code.ts] }); await child.output(); // Could hang indefinitely // ✅ Correct - implement timeout handling const child await sandbox.spawn(deno, { args: [run, /tmp/user_code.ts], stdout: piped, stderr: piped }); // Set a timeout to kill the process const timeoutId setTimeout(() child.kill(), 5000); // 5 second limit try { const output await child.output(); return output; } finally { clearTimeout(timeoutId); }5. 不校验就信任沙箱输出// ❌ Wrong - directly using untrusted output as code const result await runUserCode(code); // Never execute or inject untrusted output! // ✅ Correct - validate and sanitize output const result await runUserCode(code); try { const parsed JSON.parse(result); // Parse as data, not code if (isValidResponse(parsed)) { return parsed; } } catch { throw new Error(Invalid response from sandbox); }沙箱隔离的是「执行过程」不代表「输出可信」恶意代码仍可能返回精心构造的 payload因此必须把输出当数据处理JSON.parse schema 校验而不是当代码执行或注入。延伸阅读技能原文deno-sandbox/SKILL.md技能注册表条目含哈希与审核状态index.jsonDeno 技术栈检测映射skills-map.ts技能安装与哈希校验实现installer.ts在 Deno 项目根目录执行npx autoskills即可自动检测并安装本技能含deno-sandbox到对应 Agent 目录赞分享【免费下载链接】autoskillsOne command. Your entire AI skill stack. Installed.项目地址https://gitcode.com/gh_mirrors/au/autoskills点击查看免费下载相关推荐agent-browser 沙箱集成实战agent-browser/sandbox 安装与运行助手完全指南agent browser 沙箱集成实战agent browser/sandbox 安装与运行助手完全指南 agent browser/sandbox 是浏览器控制CLIAI 应用GUI 自动化开发工具AI 技能MCP 服务VoltAgent 集成 Daytona 沙箱voltagent/sandbox-daytona 实战指南VoltAgent 集成 Daytona 沙箱voltagent/sandbox daytona 实战指南 voltagent/sandbox dayto人工智能AI AgentAgent 框架后端多智能体RAG工具调用Agent 记忆Agent 工作流AI 评测MCP 服务MCP Clients语音huggingface_hub Sandbox 沙箱 API 参考Sandbox、SandboxPool 与数据结构的完整解析huggingface_hub Sandbox 沙箱 API 参考Sandbox、SandboxPool 与数据结构的完整解析 Sandbox 是 huggi开发工具CLI机器学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表