2009-11-18 65 views
1

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

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

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

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

+0

“因为宿主应用程序是程序员的工具”而你不能相信他们调试自己的问题?我认为你对他们做得太多了。你担心什么确切的滥用情况?他们是否会在一切机会上颠覆一切的精神病反社会人士?或者会出现语法错误的罕见问题? – 2009-11-18 18:42:30

+0

我可能过于保护,但如果配置文件出现问题,我确实希望发出描述性和准确的错误消息。我总是欣赏其他软件中的那种细节。我仍然想知道使用Python代码配置文件的可能性。 – yukondude 2009-11-18 21:31:50

回答

3

我们为我们的一些内部工具

我们做什么,从异常问题,保护我们,并阻止由用户任何企图得到的配置脚本过于创意做到这一点。但它不能保护我们免受无限循环或积极恶意的第三方的侵害。

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

  1. 首先,我们要经过__ __内置模块,我们不希望他们能够触摸德尔一切,尤其是__ __进口。我们实际上是在一个上下文管理器中执行此操作,该管理器将原始值备份起来并在途中将其删除,然后在返回时恢复原始值。

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

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

  4. 该exec当然包裹在一个尝试,除了会捕获任何东西。

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

点这里要注意:

  1. 这可能是很有诱惑力的预填充用的东西命名空间,可能是到配置脚本是有用的,但你要非常小心,这样做,便可快速打开挂钩回主机程序。

  2. 配置脚本仍然可以创建函数和类,因此您可能会找回类似字符串的东西,但实际上它是可执行代码的任意一组。

由于这些强加给我们,我们的配置脚本预计将生产纯原始数据结构(通常只是整数,字符串,列表,元组和无)的限制,我们然后分别验证。

2

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

最好的办法是查看PyPy项目的sandbox feature。这可能是你需要的,但也可能涉及到你的部分工作来进行整合。

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

你也许应该问问自己,这个问题实际上对你有多重要。我想这取决于你的用例以及谁将写入配置代码。

+0

谢谢,我的确在研究PyPy的沙盒,但是想知道这是否足以满足我的需求。 – yukondude 2009-11-18 21:35:12