【问题标题】:Possible to sandbox Python configuration file?可以对 Python 配置文件进行沙箱处理吗?
【发布时间】:2010-12-17 23:04:11
【问题描述】:

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

虽然我看到onetwo SO 对在配置文件中使用可执行代码的优点提出疑问,但我很好奇是否有办法在“沙盒”中执行配置文件代码以防止锁定主机应用程序的代码错误。

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

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

【问题讨论】:

  • “因为宿主应用程序是程序员的工具” 而且您不能相信他们会调试自己的问题吗?我觉得你为他们做的太多了。您担心哪些确切的滥用情况?他们是精神病的反社会者,会利用每一个机会颠覆一切吗?还是会出现语法错误的罕见问题?
  • 我可能过于保护了,但如果配置文件有问题,我确实想发布描述性和准确的错误消息。我一直很欣赏其他软件中的那种细节。我仍然想知道在使用 Python 代码配置文件时这有多大可能。

标签: python configuration sandbox


【解决方案1】:

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

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

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

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

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

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

  4. exec 当然被包裹在一个 try 中,除非它会捕获任何东西。

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

这里需要注意的地方:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 谢谢,我确实研究了 PyPy 的沙盒,但想知道这是否对我的需求来说太过分了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 2013-07-22
    • 2014-05-10
    • 1970-01-01
    • 2011-09-10
    相关资源
    最近更新 更多