1

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

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

因为主机应用程序是程序员的工具,所以我不关心教授 Python 语法或引入至少一个其他 SO question中提到的安全漏洞。但我担心配置代码分支到 Fishkill并嵌入主机应用程序。我更希望主机应用程序捕获这些问题并显示诊断错误信息。

有没有人为 Python 配置文件尝试过这种沙盒?如果是这样,哪些技术被证明是有用的,以及出现了哪些我应该注意的陷阱?

4

2 回答 2

3

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

我们所做的工作可以保护我们免受异常问题的影响,并阻止用户在配置脚本中过度发挥创意。然而,它并不能保护我们免受无限循环或恶意第三方的侵害。

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

  1. 首先,我们通过 __ 内置 __ 模块并删除我们不希望它们能够接触的所有内容,尤其是 __ import __。实际上,我们在上下文管理器中执行此操作,该管理器备份原始值并在输入时删除它们,然后在返回时恢复原始值。

  2. 接下来我们创建一个空字典作为配置脚本命名空间。

  3. 然后我们使用命名空间执行配置。

  4. 执行程序当然包含在尝试中,除非它会捕获任何东西。

  5. 最后我们检查命名空间以提取我们感兴趣的变量。

这里要注意的点:

  1. 使用可能对配置脚本有用的东西来预填充命名空间可能很诱人,但您需要非常小心地快速打开挂钩回到主机程序。

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

由于这些,我们施加了限制,即我们的配置脚本应该生成纯原始数据结构(通常只是整数、字符串、列表、元组和无),然后我们单独验证这些数据结构。

于 2010-09-12T23:48:37.587 回答
2

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

最好的办法是查看 PyPy 项目的沙盒功能。这可能是您需要的,但也可能需要您进行大量工作才能进行集成。

对于 Python 沙盒,是否有替代 rexec 的方法?也讨论了这个话题。

您可能还应该问自己这个问题对您实际上有多重要。我想这取决于您的用例以及谁将编写配置代码。

于 2009-11-18T18:07:53.083 回答