python中的沙箱

📅2026/7/13 14:12:46 👁️次浏览
python中的沙箱
在编程 / AI 场景中“沙箱Sandbox” 是一个 “隔离、安全的执行环境”防止危险代码影响主系统。以 “Python 代码执行沙箱比如 LangChain Agent 用的代码沙箱” 为例构建时通常包含以下核心部分1.隔离环境核心进程 / 容器隔离用独立进程、Docker 容器等方式把沙箱和主程序 / 系统隔离开防止恶意代码篡改主环境资源限制限制沙箱的 CPU、内存、磁盘 IO防止代码占满资源网络隔离可选禁止沙箱访问外部网络防止代码窃取数据 / 发起攻击。2.代码执行器代码解析 / 验证检查代码是否包含危险操作比如os.system()、rm -rf /等恶意命令代码执行安全执行代码的核心逻辑比如用exec()、subprocess等但要做安全封装输出捕获用io.StringIO等工具捕获代码的print输出、报错信息方便返回给 Agent。3.环境初始化预加载依赖提前安装沙箱需要的库比如 Agent 常用的pandas、matplotlib初始化上下文给沙箱传入必要的变量比如employees_df等数据但要避免传入敏感数据权限控制限制沙箱能访问的模块 / 函数比如禁止os、sys等危险模块。4.安全防护危险代码拦截用 AST抽象语法树分析代码禁止import os、eval()等危险操作超时机制设置代码执行的超时时间防止死循环 / 无限等待异常捕获捕获代码执行中的报错比如语法错误、运行时错误避免沙箱崩溃。5.结果返回结构化结果把代码的 “输出内容、执行状态成功 / 失败、报错信息” 整理成统一格式资源清理执行完代码后销毁沙箱进程 / 容器释放资源。6.简单示例简单 Python 沙箱的核心逻辑python运行import io import sys import subprocess import time def run_sandbox_code(code, timeout10): # 1. 安全检查示例禁止危险关键词 dangerous_keywords [os., sys., subprocess., rm -rf] if any(keyword in code for keyword in dangerous_keywords): return {status: error, msg: 代码包含危险操作} # 2. 用子进程执行代码隔离环境 try: # 子进程执行捕获输出 result subprocess.run( [sys.executable, -c, code], # 用当前Python解释器执行代码 capture_outputTrue, textTrue, timeouttimeout ) # 3. 返回结果 if result.returncode 0: return {status: success, output: result.stdout} else: return {status: error, msg: result.stderr} except subprocess.TimeoutExpired: return {status: error, msg: 代码执行超时}## 构建 Python 代码执行沙箱 #环境初始化——预加载依赖 import traceback from io import StringIO from contextlib import redirect_stdout from langchain.tools import tool #环境初始化——初始化上下文传入必要的变量三张表和权限控制限制沙箱能访问的模块/函数 SANDBOX_GLOBALS { # 数据Agent 可以分析这三张表 employees_df: employees_df, products_df: products_df, orders_df: orders_df, # 工具库Agent 可以用这些库做分析和画图 pd: pd, plt: plt, sns: sns, np: np, } tool def execute_python_code(code: str) - str: 执行 Python 代码进行数据分析和可视化。 可用变量 - employees_df: 员工表 DataFrame字段id, name, department, salary, hire_date - products_df: 产品表 DataFrame字段id, product_name, category, price, stock - orders_df: 订单表 DataFrame字段id, employee_id, product_id, quantity, order_date - pd: pandas 库 - plt: matplotlib.pyplot - sns: seaborn - np: numpy 使用示例 # 统计各部门平均薪资 result employees_df.groupby(department)[salary].mean() print(result) # 画柱状图 plt.figure(figsize(10, 6)) employees_df.groupby(department)[salary].mean().plot(kindbar) plt.title(各部门平均薪资) plt.show() #隔离环境——准备隔离的执行环境 exec_globals dict(SANDBOX_GLOBALS) exec_locals {} #代码执行器——捕获输出 output_buffer StringIO() #代码执行器——代码执行 try: with redirect_stdout(output_buffer): exec(code, exec_globals, exec_locals) result output_buffer.getvalue() if not result.strip(): result ✅ 代码执行成功无文本输出可能已生成图表 return f执行成功\n{result} #安全防护——异常捕获 except Exception as e: error_detail traceback.format_exc() return f❌ 执行出错{e}\n\n{error_detail} print(✅ Python 代码执行沙箱创建成功)总结沙箱的核心是“隔离 安全 可控”既要让代码能正常执行又要防止它影响外部环境