代码之家  ›  专栏  ›  技术社区  ›  yukondude

是否可以对python配置文件进行沙盒处理?

  •  1
  • yukondude  · 技术社区  · 15 年前

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

    当我看到 one two 因此,对于在配置文件中使用可执行代码的优点,我很好奇是否有一种方法可以在“沙盒”中执行配置文件代码,以防止代码中的错误锁定宿主应用程序。

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

    是否有人尝试过对python配置文件进行这种沙盒处理?如果是这样的话,哪些技术被证明是有用的,我应该意识到哪些陷阱?

    2 回复  |  直到 12 年前
        1
  •  3
  •   Gordon Wrigley    14 年前

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

    我们所做的工作可以保护我们不受异常问题的影响,并阻止用户在配置脚本中进行过多的创造性尝试。然而,它并不能保护我们免受无限循环或积极恶意的第三方的伤害。

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

    1. 首先,我们检查一下内置模块,然后删除所有我们不想让它们接触到的东西,尤其是导入模块。我们实际上是在一个上下文管理器中完成的,它将原始值备份起来,并在返回的过程中对其进行dels,然后在返回的过程中恢复原始值。

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

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

    4. 当然,exec被包装在一个try中,除了捕获任何内容。

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

    此处需要注意的要点:

    1. 用可能对配置脚本有用的东西预填充命名空间可能很有诱惑力,但是您希望非常小心,这样可以快速打开钩子并返回到宿主程序中。

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

    由于这些原因,我们强加了这样的限制,即我们的配置脚本应该生成纯的原始数据结构(通常只是ints、strings、list、tuples和none),然后我们单独验证。

        2
  •  2
  •   Community Doug McClean    7 年前

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

    你最好去看看Pypy项目的 sandbox feature . 这可能是您所需要的,但也可能涉及到您需要集成的相当多的工作。

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

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