解析不可信代码的抽象语法树是否安全?

时间:2013-09-22 19:45:10

标签: python parsing abstract-syntax-tree

使用ast模块以编程方式解析和修改不受信任的外部Python代码是否可以?

我将解析源代码,从源代码中获取一些信息(文档字符串,函数定义,也许,我不知道)并将其留在那里,而不是编译或运行它。

3 个答案:

答案 0 :(得分:4)

如果您正在使用ast.parse功能,那么它应该是安全的。正如文档所说,这个函数将

  

将源解析为AST节点。相当于编译(源,文件名,模式,ast.PyCF_ONLY_AST)

即使它包含无效的Python代码,它也只是解析文件。它没有做任何评估。

如果您的目标是评估表达式,那么您可以使用ast.literal_eval,这比内置的eval语句更安全

答案 1 :(得分:3)

“不安全”意味着可能由您正在参与的神器控制的坏事。由于解析只构建AST,并且(假设解析和AST构建代码中没有恶意内容),因此解析任意一段文本不会对您造成伤害。

通常,为了从外部获取恶意行为,某些内容(由控制)必须基本上执行一些提供的代码。显然,构建解析树不会执行外部程序。但是,如果您构建了一个解释解析树并运行它的解释器,那么您可能会遇到问题。

答案 2 :(得分:2)

我相信。没有代码被执行。实际上,解析ast正是ast.literal_eval所做的,这被认为是安全的。