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, timeout=10):
# 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_output=True,
text=True,
timeout=timeout
)
# 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(kind='bar')
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 代码执行沙箱创建成功")
总结:沙箱的核心是“隔离 + 安全 + 可控”,既要让代码能正常执行,又要防止它影响外部环境~
更多推荐


所有评论(0)