使用PyPy Sandbox来引用标准的python模块?

时间:2013-07-23 18:03:34

标签: python sandbox interpreter pypy

我目前正在开发一个在我的网站中嵌入Python解释器的项目 - 我希望用户能够在安全的Python沙箱中在服务器端执行自己的Python代码。我一直在使用PyPy的沙盒功能,并将我的虚拟tmp /目录(对应于沙箱可以读取的真实目录)设置为我的服务器端文件。理想情况下,用户将能够在服务器上运行自己的代码,并使用我提供给他们的任何库(没有能力写入任何这些文件/进行系统调用/做任何通常会弄乱我的文件的东西) )。

问题是在我的服务器端代码中,我使用标准的Python库以及我单独安装的其他库(例如“import datetime”,“import pandas”等)。虽然沙箱可以读取我的服务器端代码,但只要我尝试在此代码中导入其他库,它就会失败。我曾想过将我的虚拟tmp /目录设置为包含我的服务器端文件+标准Python库+单独安装的库,如PANDAS。但是,当我尝试将它设置为Python库时,它最终无法正常工作,更不用说这个解决方案看起来非常不优雅了。

有关如何解决这个问题的任何想法?我很感激任何人的建议。谢谢!

编辑:我认为部分答案在于pypy_interact.py的以下部分(完整的源代码可以在这里找到:https://github.com/ojii/sandlib/blob/master/sandlib/pypy_interact.py):

 def build_virtual_root(self):
    # build a virtual file system:
    # * can access its own executable
    # * can access the pure Python libraries
    # * can access the temporary usession directory as /tmp
    exclude = ['.pyc', '.pyo']
    if self.tmpdir is None:
        tmpdirnode = Dir({})
    else:
        tmpdirnode = RealDir(self.tmpdir, exclude=exclude)
    libroot = str(LIB_ROOT)

    return Dir({
        'bin': Dir({
            'pypy-c': RealFile(self.executable),
            'lib-python': RealDir(os.path.join(libroot, 'lib-python'),
                                  exclude=exclude), 
            'lib_pypy': RealDir(os.path.join(libroot, 'lib_pypy'),
                                  exclude=exclude),
            }),
         'tmp': tmpdirnode,
         })

我相对较新的Python,似乎无法弄清楚如何正确使用此方法。任何建议都将不胜感激。

0 个答案:

没有答案