我打算在python(+ qt4)中编写一个可插拔的应用程序。但是我对安全问题非常关注。插件应该足够强大,以便在应用程序中做任何他们喜欢的事情(并且作为进一步的约束,在使用这样的插件时会有签名过程和用户警告),但是与环境交互(文件系统,其他进程) ,网络等)应该只通过我将编写的一些python代码来完成插件。
除了必须在安装插件代码之前对插件代码进行静态代码分析之外,有没有安全简便的方法来实现它?
答案 0 :(得分:5)
简而言之:否。
说明:多年来,Python大师试图为Python构建一个沙箱。沙盒的问题在于您需要做一些事情来做任何IO(即能够在沙箱和应用程序之间传输数据)。他们没有找到一种自动的,pythonic方式来做到这一点。或者,你不能用插件交换数据,或者内省然后允许在应用程序中遍历对象树 - >访问你喜欢的一切。
想象一下你的想法:插件调用你编写的一些python代码。这可能意味着调用方法或函数。这意味着你必须给我一个有效的方法或功能对象。从方法或函数对象,我可以得到您的模块对象。从您的模块中,我可以获得所有符号(即导入)。从那里,我可以做你的模块可以做的所有事情(至少)。
See this article以获取一些指示。
答案 1 :(得分:2)
在普通Python进程中运行的Python代码无法进行沙盒化,因为您可以随时爬出,但可以对整个Python解释器进行沙箱化。
例如PyPy支持沙盒:http://codespeak.net/pypy/dist/pypy/doc/sandbox.html
如果你愿意,你可以编写一个python库来在一个安全的pypy-c实例中运行一个python脚本,其中一些共享内存用于传输你信任的数据和一些信号来触发程序中的事件。 / p>
您也可以使用像selinux这样的东西来沙箱普通的嵌入式cpython解释器,我相信它可以在代码中使用(它通常是系统管理员的东西),并且在大多数Linux发行版或任何Windows替代方案都支持,取决于你的平台。如果您愿意挖掘庞大的代码库,Google Chrome会提供一些沙盒代码。
答案 2 :(得分:1)
这是一个非常古老的问题,但也许QtScript可能就是答案。但是,我不知道你是否可以沙箱这个,以及QtScript是否足够强大,适合你的应用程序。