香港特别行政区网站建设_网站建设公司_UX设计_seo优化
2026/1/22 11:45:35 网站建设 项目流程

在现代 AI 应用开发中,安全地执行用户提供的代码是一个常见但极具挑战性的需求。LangChain 提供了一个基于 Deno 和 Pyodide 的轻量级沙箱工具 ——langchain-sandbox,它可以在隔离环境中运行 Python 代码,同时通过细粒度权限控制保障系统安全。

本文将带你深入了解如何使用langchain-sandbox(版本 0.0.6)来构建一个安全、可控的 Python 执行环境,并附带两个实用示例。


📦 安装与依赖

首先确保你已安装langchain-sandbox

pipinstalllangchain-sandbox

该包依赖于:

  • langchain-core
  • langgraph

此外,必须安装 Deno(>=1.40 推荐),因为沙箱底层通过 Deno 调用 Pyodide 运行 Python 代码。

验证安装:

deno --version

🔒 沙箱核心机制:权限控制

langchain-sandbox基于Deno 的权限模型,提供以下安全选项:

权限说明
allow_env是否允许访问环境变量
allow_read允许读取的目录或文件列表
allow_write允许写入的目录或文件列表
allow_net是否允许网络请求(可指定域名白名单)
allow_run是否允许执行子进程
allow_ffi是否允许调用本地函数接口(高危)

默认情况下,所有权限均为拒绝,开发者需显式开启所需权限。


🧪 示例代码详解

下面我们将通过两个完整示例,展示如何使用pyodide_sandbox.py封装的Sandbox类。

⚠️ 注意:以下代码直接来自官方 demo,未做任何修改,可直接复制运行。

文件结构

. ├── pyodide_sandbox.py # 核心沙箱封装 └── demo.py # 使用示例

✅ 示例 1:无参数的简单代码执行

# demo.py 中的示例 1simple_code=""" print("Hello from Pyodide sandbox!") import sys print(f"Python version: {sys.version.split()[0]}") x = 100 y = 200 x * y + 42 """print("=== 示例 1:无参数 ===")output1:Output=sandbox.execute(simple_code,timeout_seconds=15)print(f"状态:{output1.status}")print(f"执行时间:{output1.execution_time:.2f}s")ifoutput1.stdout:print("标准输出:\n"+output1.stdout.strip())ifoutput1.stderr:print("错误输出:\n"+output1.stderr.strip())ifoutput1.resultisnotNone:print("返回结果:",output1.result)

输出效果:

=== 示例 1:无参数 === 状态: success 执行时间: 1.23s 标准输出: Hello from Pyodide sandbox! Python version: 3.11.9 返回结果: 20042

说明

  • 代码在 Pyodide 环境中运行(非本地 Python)
  • 最后一行表达式x * y + 42的值被自动作为返回结果
  • 无网络、无文件写入,完全隔离

✅ 示例 2:带参数的异步函数执行

# demo.py 中的示例 2function_code=""" async def main(args): name = args.params.get("name", "陌生人") num = args.params.get("num", 1) print(f"收到参数: name={name}, num={num}") await asyncio.sleep(0.1) return { "greeting": f"Hello, {name}!", "result": num * 42 } """print("\n=== 示例 2:带参数 ===")output2:Output=execute_function(code=function_code,params={"name":"小白","num":10},timeout_seconds=15,)print(f"状态:{output2.status}")print(f"执行时间:{output2.execution_time:.2f}s")ifoutput2.stdout:print("标准输出:\n"+output2.stdout.strip())ifoutput2.stderr:print("错误输出:\n"+output2.stderr.strip())ifoutput2.resultisnotNone:print("返回结果:",output2.result)

输出效果:

=== 示例 2:带参数 === 状态: success 执行时间: 0.35s 标准输出: 收到参数: name=小白, num=10 返回结果: {'greeting': 'Hello, 小白!', 'result': 420}

说明

  • 用户代码必须定义async def main(args)函数
  • args.params接收传入的参数字典
  • 支持asyncio.sleep等异步操作
  • 返回值为 JSON 序列化对象

🔧 沙箱配置详解(Sandbox 初始化)

demo.py中,我们这样初始化沙箱:

sandbox=Sandbox(allow_env=False,allow_read=["."],# 允许读取当前目录allow_write=["."],# 允许写入当前目录allow_net=False,# 禁止网络memory_limit_mb=256,# 内存限制 256MB)

💡 实际生产中,建议最小权限原则:只开放必要权限。例如,若无需写文件,则allow_write=False


⚠️ 安全注意事项

  1. 不要开启allow_ffiallow_run,除非你完全信任代码来源。
  2. 网络访问 (allow_net)应限制到具体域名,如["api.example.com"]
  3. 内存和超时限制必须设置,防止 DoS 攻击。
  4. 所有代码在Pyodide(浏览器级 Python)中运行,无法访问宿主机文件系统(即使allow_read=["."]也只是虚拟文件系统)。

🚀 适用场景

  • LLM 生成代码的安全执行(如 LangChain Agent 工具调用)
  • 在线编程教学平台
  • 用户自定义脚本插件系统
  • 安全的公式/表达式计算引擎

🔚 总结

langchain-sandbox提供了一种轻量、安全、基于 WebAssembly 的 Python 沙箱方案。通过 Deno + Pyodide 的组合,它实现了:

  • 强隔离性(无系统调用)
  • 细粒度权限控制
  • 异步支持
  • JSON 序列化输入输出

虽然目前仍处于早期版本(0.0.6),但对于需要在服务端安全执行不可信 Python 代码的场景,它是一个非常值得尝试的工具。

安装教程参考

使用 jsr:@langchain/pyodide-sandbox 构建 Python 安全沙箱(完整入门教程)

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询