是否可以对Python配置文件进行沙箱处理?

是否可以对Python配置文件进行沙箱处理?,python,configuration,sandbox,Python,Configuration,Sandbox,我正在考虑实现一个用Python语法编写的配置文件,这与Django的做法没有什么不同 虽然我已经看到了一些关于在配置文件中使用可执行代码的优点的问题,但我很好奇是否有一种方法可以在“沙箱”中执行配置文件代码,以防止代码中的错误锁定主机应用程序 因为宿主应用程序是程序员的工具,所以我不关心教授Python语法或引入安全漏洞,至少在本文中提到过。但我担心的是配置代码和主机应用程序。我更希望主机应用程序捕捉这些问题并显示诊断错误信息 有人对Python配置文件尝试过这种沙盒吗?如果是这样的话,哪些技

我正在考虑实现一个用Python语法编写的配置文件,这与Django的做法没有什么不同

虽然我已经看到了一些关于在配置文件中使用可执行代码的优点的问题,但我很好奇是否有一种方法可以在“沙箱”中执行配置文件代码,以防止代码中的错误锁定主机应用程序


因为宿主应用程序是程序员的工具,所以我不关心教授Python语法或引入安全漏洞,至少在本文中提到过。但我担心的是配置代码和主机应用程序。我更希望主机应用程序捕捉这些问题并显示诊断错误信息


有人对Python配置文件尝试过这种沙盒吗?如果是这样的话,哪些技术被证明是有用的,哪些陷阱是我应该注意的?

不幸的是,对于标准Python这个问题,您没有什么可以做的。当Python解释器运行“配置代码”时,该代码可以执行它喜欢的任何操作,包括访问主机程序或不返回控制。在单独的进程中运行配置代码可能会有所帮助,但也会限制主机和配置代码之间的交互

你最好的选择是查看PyPy项目的。这可能是您所需要的,但也可能需要您进行大量的集成工作

也讨论了这个话题


你可能还应该问问自己这个问题对你来说到底有多重要。我想这取决于您的用例和谁将编写配置代码。

不幸的是,对于标准Python,您不能做很多事情。当Python解释器运行“配置代码”时,该代码可以执行它喜欢的任何操作,包括访问主机程序或不返回控制。在单独的进程中运行配置代码可能会有所帮助,但也会限制主机和配置代码之间的交互

你最好的选择是查看PyPy项目的。这可能是您所需要的,但也可能需要您进行大量的集成工作

也讨论了这个话题


你可能还应该问问自己这个问题对你来说到底有多重要。我想这取决于您的用例和谁将编写配置代码。

我们为一些内部工具这样做

我们所做的保护我们免受异常问题的影响,并阻止用户试图在配置脚本中获得过度的创造性。然而,它不能保护我们免受无限循环或恶意第三方的攻击

这里方法的核心是在锁定的exec中运行脚本

  • 首先,我们通过“内置”模块,删除我们不希望他们接触的所有内容,尤其是“导入”。我们实际上是在一个上下文管理器中这样做的,它备份原始值,并在输入的过程中对它们进行del,然后在返回的过程中恢复原始值

  • 接下来,我们创建一个空字典作为配置脚本名称空间

  • 然后使用名称空间执行配置

  • 当然,exec是在尝试中完成的,除非它能抓住任何东西

  • 最后,我们检查名称空间以提取我们感兴趣的变量

  • 此处需要注意的要点:

  • 在名称空间中预填充一些对配置脚本可能有用的内容可能很有诱惑力,但您需要非常小心,以便快速打开钩子返回到宿主程序

  • 配置脚本仍然可以创建函数和类,因此您可能会得到一些看起来像字符串的东西,例如,但实际上是一个任意的可执行代码块


  • 由于这些原因,我们对配置脚本施加了限制,要求它生成纯粹的原始数据结构(通常只有int、string、list、tuple和None),然后我们分别验证这些数据结构。

    我们对一些内部工具这样做

    我们所做的保护我们免受异常问题的影响,并阻止用户试图在配置脚本中获得过度的创造性。然而,它不能保护我们免受无限循环或恶意第三方的攻击

    这里方法的核心是在锁定的exec中运行脚本

  • 首先,我们通过“内置”模块,删除我们不希望他们接触的所有内容,尤其是“导入”。我们实际上是在一个上下文管理器中这样做的,它备份原始值,并在输入的过程中对它们进行del,然后在返回的过程中恢复原始值

  • 接下来,我们创建一个空字典作为配置脚本名称空间

  • 然后使用名称空间执行配置

  • 当然,exec是在尝试中完成的,除非它能抓住任何东西

  • 最后,我们检查名称空间以提取我们感兴趣的变量

  • 此处需要注意的要点:

  • 在名称空间中预填充一些对配置脚本可能有用的内容可能很有诱惑力,但您需要非常小心,以便快速打开钩子返回到宿主程序

  • 配置脚本仍然可以创建函数和类,因此您可能会得到一些看起来像字符串的东西,例如,但实际上是一个任意的可执行代码块


  • 由于这些原因,我们施加了一个限制,即我们的配置脚本需要生成纯粹的原始数据结构(通常只有int、string、list、tuple和None),然后我们单独验证。

    “因为宿主应用程序是程序员的工具”,您不能相信它们会调试自己的问题?我觉得你为他们做的太多了。你到底担心什么样的虐待场景?他们是精神病反社会者吗