我正在制作一款游戏,用户可以编写Python程序来控制互相攻击的机器人。每转一圈(在一个转弯的游戏中)他们的脚本将在我的服务器上运行,以确定机器人的下一步行动。如何防止这些用户对我的服务器有误?
我想过/研究了以下内容:
eval
他们的代码在有限的环境中(即禁用__builtins__
)chroot
/ ptrace
我有一个Python程序,它运行用户的脚本一千次。如何强制执行一分钟的最长总持续时间,限制其内存资源,阻止它们访问任何文件或网络连接等等?什么是理想的解决方案或解决方案组合?
答案 0 :(得分:5)
我在PythonAnywhere上工作,这是一个Python平台即服务,这意味着我们代表我们的用户运行了许多不受信任的代码 - 首页上的新交互式控制台Python.org是我们的,它的限制可能与你的不太相同。
我建议使用操作系统级虚拟化;语言层面的任何东西都可能不那么安全。出于历史原因,我们使用chroot和cgroup,但如果我们今天从头开始,我认为我们将使用Linux容器(LXC)或Docker。 LXC基本上是chroot和cgroups等一堆聪明的包装器,这使得它们更容易使用,因此你可以真正快速地启动一个短暂的虚拟机。而Docker是一个更易于使用的LXC包装器。两者都超级快 - 您可以在不到一秒的时间内启动并运行新的VM。
答案 1 :(得分:3)
答案 2 :(得分:0)
没有内置的方法在cpython中运行沙盒代码,但是在pypy中。
http://pypy.org/features.html#sandboxing
python wiki上描述了一些其他方法(比如使用jailkit),但它们似乎有各种缺点。
https://wiki.python.org/moin/SandboxedPython
我会去pypy路线。