0

0

Python 动态加载代码的沙箱隔离

冰川箭仙

冰川箭仙

发布时间:2026-02-25 19:29:02

|

568人浏览过

|

来源于php中文网

原创

exec()和eval()不能直接当沙箱用,因其默认共享调用者命名空间,易触发系统调用或污染内置函数;安全做法是显式传入隔离的globals/locals、白名单控制__builtins__、必要时采用进程级隔离。

python 动态加载代码的沙箱隔离

exec() 和 eval() 为什么不能直接当沙箱用

因为它们默认共享调用者的全局/局部命名空间,exec() 里一句 import os; os.system("rm -rf /") 就能触发真实系统调用——这不是隔离,是裸奔。

常见错误现象:NameError 看似安全,实则只是没碰到底层模块;更危险的是代码悄悄修改了外层变量,比如在 exec() 里给 __builtins__.open = lambda *a, **k: None,后续所有模块的文件操作都失效了,但错误发生在别处,极难定位。

  • 必须显式传入干净的 globalslocals 字典,且二者不能是同一个对象(否则 locals() 修改会污染 globals()
  • globals 字典至少要包含 {"__builtins__": {}},否则连 len()range() 都用不了
  • 不要复用已有字典(如 globals().copy()),里面可能混着 __import__compile 这类高危函数

如何安全地限制内置函数和模块访问

核心不是“删掉什么”,而是“只留下什么”。Python 没有原生沙箱机制,得靠白名单控制入口点。

使用场景:执行用户提交的简单计算表达式(如 "2 + 3 * x"),或预定义 API 的轻量脚本(如配置驱动的条件判断逻辑)。

立即学习Python免费学习笔记(深入)”;

医真AI+开放平台
医真AI+开放平台

医真AI+ 医学AI开放平台

下载
  • 构造最小 __builtins__:只保留 intfloatstrlenmax 等纯函数,彻底剔除 __import__openexeceval
  • 如果需要导入模块,必须自己封装一个受控的 import_module() 函数,硬编码允许列表,禁止相对导入和动态模块名
  • 注意 __builtins__ 在不同 Python 版本中可能是 dict 或 module 对象,统一用 dict(__builtins__) 转换再过滤

ast.literal_eval() 适合什么,不适合什么

它只处理字面量(123"hello"[1,2]{"a": True}),不执行任意代码,天生安全。但这也意味着它根本不是“动态加载代码”的方案。

常见错误现象:用户传入 "func(x)""a + b"ast.literal_eval() 直接抛 ValueError: malformed node or string,而不是你期望的“安全拒绝”。

  • 适合解析配置、JSON-like 数据、用户输入的结构化参数
  • 不适合表达式计算、函数调用、任何含运算符或标识符的字符串
  • 性能上比 eval() 略慢,但差距可忽略;关键是它不提供执行上下文控制能力

真正隔离还得靠进程级边界

纯 Python 层面的沙箱永远存在绕过可能(比如通过 getattr 拿到类型对象再反射出危险方法)。生产环境需要硬隔离。

使用场景:运行不可信第三方插件、在线编程题评测、低权限策略脚本执行。

  • subprocess.run() 启动独立 Python 进程,通过 stdin/stdout 通信,主进程完全不暴露解释器状态
  • 配合 timeoutlimit memory(Linux 下用 ulimitresource 模块)防死循环和内存爆炸
  • 注意 Windows 下 subprocess 启动开销较大,高频调用需考虑连接池或长进程模型

最易被忽略的一点:即使做了所有 Python 层过滤,只要没禁用 __import__,攻击者就能通过 ().__class__.__mro__[1].__subclasses__() 找到 os._wrap_close 之类冷门路径,最终拿到 os 模块——进程隔离才是兜底防线。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

448

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

544

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

323

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

81

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

850

2023.08.02

css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

592

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

105

2025.10.23

resource是什么文件
resource是什么文件

Resource文件是一种特殊类型的文件,它通常用于存储应用程序或操作系统中的各种资源信息。它们在应用程序开发中起着关键作用,并在跨平台开发和国际化方面提供支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

171

2023.12.20

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

127

2026.02.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号