前言:我知道许多人已经尝试在Python中进行Python代码的沙盒化并失败了,但我没有看到过另外一种方法,即对脚本进行文本预处理并拒绝包含关键字(如
我计划编写一个多人策略游戏,在这个游戏中,玩家通常不能使用键盘/鼠标命令与他们的单位交互,而只能通过提交脚本来改变单位的自动行为。这基于以下想法:http://screeps.com。
我很想用Python 3编写它,但主要问题似乎是在服务器上安全执行不受信任的外部玩家脚本。我知道我可能不信任
但我认为我还有一次机会:我可以对提交的脚本进行文本预处理,并搜索像
这种方法是否与使用自定义
如果不是,为什么会失败?你能提出更好的解决方案吗?
__base__
)的脚本,这些关键字可以用于恢复隐藏的__buuiltins__
。我认为这种方法是新的,并且尚未被证明失败 - 是吗?我计划编写一个多人策略游戏,在这个游戏中,玩家通常不能使用键盘/鼠标命令与他们的单位交互,而只能通过提交脚本来改变单位的自动行为。这基于以下想法:http://screeps.com。
我很想用Python 3编写它,但主要问题似乎是在服务器上安全执行不受信任的外部玩家脚本。我知道我可能不信任
exec()
或eval()
,即使将空的globals
和locals
作为环境传递给它们。我也知道,仅仅擦除__builtins__
也不起作用,因为可以使用Python的内省功能轻松地还原它们,如此处所述:http://nedbatchelder.com/blog/201302/finding_python_3_builtins.html
我已经了解到PyPy或Jython可能具有某种沙盒化功能,这可能适用于我的目的,但我更愿意使用CPython参考解释器。此外,我只能找到那些沙盒化功能适用于整个程序的示例,但没有一个由主程序运行不受信任的脚本作为子线程并与其高效通信的示例。但我认为我还有一次机会:我可以对提交的脚本进行文本预处理,并搜索像
__class__
或__base__
之类的字符串,并拒绝包含这些关键字的脚本。我还必须替换脚本中的eval()
和exec()
为我的自己安全的函数,这些函数也拒绝运行包含这些关键字的代码。这种方法是否与使用自定义
globals
参数覆盖所有潜在危险项(哪些是?)的exec()
一起安全?我需要查找哪些关键字?如果不是,为什么会失败?你能提出更好的解决方案吗?
exec
的方法不够安全,而那些提到其他解释器的方法也不完全符合我的要求。对于 PyPy 也是一样。 - Byte Commander