我想创建一个人们可以上传他们的Python脚本的网站。当然我想执行这些脚本。这些脚本应该做一些有趣的工作。问题是人们可能上传可能损害我的服务器的脚本,我想阻止它。在不损害我的系统的情况下运行任意脚本的选项是什么 - 实际上根本没有看到我的系统?谢谢
答案 0 :(得分:7)
答案 1 :(得分: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
返回的函数只能访问您在范围字典中提供的任何内容。我想知道是否还有黑客攻击。
答案 2 :(得分:3)
现在有很多网络服务器运行不受信任的python代码:
你可能想看看他们是如何处理他们的问题的。
或者你可能想看一个不同的方法:
答案 3 :(得分:2)
我认为这样做的方法是在普通的Python shell中运行这些脚本,但是在虚拟机上运行。我可能有偏见,因为我的“工作”目前正在玩虚拟机(大学很棒!)。
可以在几秒钟内创建并启动新的VM实例。如果您保留一些并且只替换那些破损的那些,那么您将获得良好的服务,绝对的安全性并且几乎不会付出任何努力。
但有一件事:今天几乎所有的网络主机都是虚拟机,它们不支持其他虚拟机。你需要一个真实的物理服务器才能做到这一点。
答案 4 :(得分:1)
“不能做”,太苛刻了。 JavaScript引擎存在于您的Web浏览器中,它们可以安全地接受和运行不受信任的脚本。总是存在漏洞利用的可能性,但在正确的发动机操作中它们是无害的。甚至还有“慢速脚本”检查,可防止无限制的拒绝服务攻击您的浏览器,从而制作那些小警报对话框。
Google App Engine运行沙盒版本的Python VM,可以有效地删除所有顽皮的本机位,让您可以进入底层系统。要以安全的方式自己完成这项工作将需要一些Python VM专业知识。
为了理智,您可以先删除所有内置文件,然后在您认证用户未触及底层系统时将其设置为白名单。
感觉就像某人必须已经做过的事情,但我不知道有任何现有的项目。 : - /
答案 5 :(得分:1)
Brett Cannon有一个暂时的设计,最后我知道,但它尚未开发。因此,除非您希望为实现这一目标投入大量精力,否则目前尚无公开解决方案。
Brett的博客位于:http://sayspy.blogspot.com/如果你想尝试阅读它,我找不到他关于新安全设计的讨论的直接链接。我不记得我是否读过他的博客谈论它,或者他是否亲自提到它,抱歉。
曾经存在一些受限制的执行能力,但由于它们无法正常工作而被删除。
这不是不可能的,但它不是Python现在能做的事情。这是人们想要的东西,但它并不是我所见过的高优先级。
答案 6 :(得分:1)
trypython.org(BSD licensed source here)在IronPython(通过Silverlight / Moonlight)中为这样的sanbox做了一个安全的浏览器导向版本。您可以将无头版本混合在一起以便在服务器上使用 - 但您绝对可以让用户在彼此之间分发脚本,或者您可以分发这些脚本以在插件环境中执行。
答案 7 :(得分:1)
如果使用Linux,seccomp可能是解决方案,即使mode 2也更好。有了这些,您可以创建一个新进程,它将使任何系统调用失败,并且只能读取已有的文件描述符。
也许使用名称空间和cgroup会有所帮助,这可以通过ctypes来完成。
答案 8 :(得分:1)
您可以尝试Ideone API - 它允许Python 2和Python 3