Python,安全,沙箱
我想做一个网站,让大家可以上传他们的Python脚本。当然,我希望能运行这些脚本,让它们做一些有趣的事情。不过,问题是,有些人可能会上传会对我的服务器造成伤害的脚本,我想要防止这种情况发生。有没有什么办法可以运行这些任意的脚本,而不会对我的系统造成伤害,实际上是完全看不到我的系统?谢谢!
9 个回答
3
现在有很多网络服务器在运行不可信的Python代码:
- http://codepad.org/(可能是最臭名昭著的Python代码粘贴板)
- http://codingbat.com/(之前叫Javabat,改名是为了加入Python的内容)
- http://appengine.google.com/(在谷歌的基础设施上托管Python代码)
- http://www.spoj.pl/(臭名昭著的Sphere Online Judge编程挑战)
你可能想看看他们是怎么解决这些问题的。
或者你也可以考虑另一种方法:
- http://pyjs.org/ - pyjamas - Python转JavaScript的编译器(在客户端运行,把安全问题转移到他们那边)
4
我不太清楚早期版本的情况,但在Python 3中,你可以通过types.FunctionType来创建可以访问自定义范围的函数。
def f():
return __builtins__
f() # this will work because it has access to __builtins__
scope = {}
sandboxed = FunctionType(f.__code__,scope)
sandboxed() # will throw NameError, builtins is not defined
返回的这个函数只能访问你在范围字典中提供的内容。我在想,是否还有其他方法可以绕过这个限制。
5
“这事儿做不了。”
运行一些不可信的脚本而又保持安全,这两者是矛盾的。你可能需要使用一些特别的技术,比如定制内核、监狱环境(jails)、虚拟机(vms)等等。
你可以看看 http://codepad.org/about 是怎么做的,这可是一项非常庞大的工作。