我正在考虑实现用Python语法编写的配置文件,这与Django的用法类似。

尽管我已经看到有关在配置文件中使用可执行代码的优点的onetwo SO问题,但我很好奇是否存在一种方法可以在“沙箱”中执行配置文件代码,以防止在配置文件中出错。代码锁定主机应用程序。

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

有没有人尝试过将此类沙箱用于Python配置文件?如果是这样,那么什么技术被证明是有用的,我应该注意哪些陷阱呢?

最佳答案

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

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

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


首先,我们通过__内置__模块,并删除所有我们不希望它们接触的内容,尤其是__ import __。我们实际上是在上下文管理器中执行此操作的,上下文管理器将备份原始值并在传入的过程中对其进行删除,然后在退出的过程中还原其原始值。
接下来,我们创建一个空字典作为配置脚本名称空间。
然后,我们使用名称空间执行配置。
该执行程序当然会进行尝试,除非会捕获任何内容。
最后,我们检查名称空间以提取我们感兴趣的变量。


这里要注意的几点:


用可能对配置脚本有用的内容来预填充名称空间可能很诱人,但是您要非常小心,以快速将钩子重新打开到主机程序中。
配置脚本仍然可以创建函数和类,因此您可能会获得一些看起来像字符串的东西,但实际上是任意的可执行代码块。


由于这些原因,我们施加了限制,要求我们的配置脚本会产生纯原始数据结构(通常只是int,字符串,列表,元组和None),然后分别进行验证。

09-10 04:44
查看更多