沙盒Python配置文件可能吗?

时间:2009-11-18 16:47:15

标签: python configuration sandbox

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

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

因为宿主应用程序是程序员的工具,所以我不关心教授Python语法或引入至少one other SO question中提到的安全漏洞。但我担心配置代码branching to Fishkill并楔入主机应用程序。我更倾向于主机应用程序捕获这些问题并显示诊断错误信息。

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

2 个答案:

答案 0 :(得分:3)

我们为一些内部工具执行此操作

我们所做的工作可以保护我们免受异常问题的影响,并阻止用户尝试在配置脚本中过度创造。但是它并不能保护我们免受无限循环或主动恶意的第三方攻击。

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

  1. 首先我们通过__ builtin __模块和del我们不希望它们触及的所有内容,尤其是__ import __。我们实际上是在一个上下文管理器中执行此操作,该管理器将原始值备份并在中途进行定义,然后在返回的路上恢复原始值。

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

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

  4. 当然,除了可以抓住任何东西外,exec当然会被包裹起来。

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

  6. 此处需要注意的事项:

    1. 使用可能对配置脚本有用的内容预填充命名空间可能很诱人,但是您需要非常小心这样做,以便快速打开挂钩回主机程序。

      < / LI>
    2. 配置脚本仍然可以创建函数和类,因此您可能会收到类似于字符串的内容,但实际上是可执行代码的任意blob。

    3. 由于这些原因,我们强制要求我们的配置脚本生成纯粹的原始数据结构(通常只是整数,字符串,列表,元组和无),然后我们单独验证。

答案 1 :(得分:2)

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

最好的办法是查看PyPy项目的sandbox feature。这可能是您所需要的,但也可能需要您完成整合工作。

Is there an alternative to rexec for Python sandboxing?也讨论了这个话题。

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