我目前正在开发一个在我的网站中嵌入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,似乎无法弄清楚如何正确使用此方法。任何建议都将不胜感激。