为了账号安全,请及时绑定邮箱和手机立即绑定

如何在纯Python中沙盒Python?

如何在纯Python中沙盒Python?

largeQ 2019-08-16 16:51:11
如何在纯Python中沙盒Python?我正在开发纯Python的网页游戏,并希望有一些简单的脚本可用于更多动态的游戏内容。特权用户可以实时添加游戏内容。如果脚本语言可以是Python,那将是很好的。但是,由于恶意用户可能会造成严重破坏,因此无法在访问游戏运行环境的情况下运行。是否可以在纯Python中运行沙盒Python?更新:事实上,由于真正的Python支持会有点过分,因此使用Pythonic语法的简单脚本语言将是完美的。如果没有任何Pythonic脚本解释器,是否有任何其他开源脚本解释器用纯Python编写,我可以使用?要求是对变量,基本条件和函数调用(不是定义)的支持。
查看完整描述

3 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

这真的非常重要。

沙箱Python有两种方法。一种是在这种环境中创建一个受限制的环境(即极少数全局等)和exec你的代码。这就是梅萨所暗示的。这很好但是有很多方法可以打破沙箱并制造麻烦。一年前在Python-dev上有一个关于这个问题的线程,其中人们通过捕获异常并在内部状态中进行操作来突破字节代码操作。如果你想要一个完整的语言,这是要走的路。

另一种方法是解析代码,然后使用ast模块踢出你不想要的构造(例如import语句,函数调用等),然后编译其余的。如果你想使用Python作为配置语言等,这是要走的路。

PyPy沙箱是另一种方式(因为你使用GAE可能不适合你)。虽然我自己没有使用它,但关于intertubes的话是它是唯一真正的沙盒Python。

根据您对需求的描述(需求是对变量,基本条件和函数调用(不是定义)的支持),您可能希望评估方法2并从代码中删除其他所有内容。这有点棘手,但可行。


查看完整回答
反对 回复 2019-08-16
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

AFAIK可以在完全隔离的环境中运行代码:

exec somePythonCode in {'__builtins__': {}}, {}

但是在这样的环境中你几乎什么也做不了:)(你甚至连import一个模块都没有;但是仍然是恶意用户可以运行无限递归或导致内存不足。)可能你会想要添加一些模块作为接口给你游戏引擎。


查看完整回答
反对 回复 2019-08-16
  • 3 回答
  • 0 关注
  • 1299 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信