是否可以使用ast模块以编程方式解析和修改不受信任的外部 Python 代码?
我将只解析源代码,从源代码中获取一些信息(文档字符串、函数定义,也许,我不知道)并将其留在那里,而不是编译或运行它。
是否可以使用ast模块以编程方式解析和修改不受信任的外部 Python 代码?
我将只解析源代码,从源代码中获取一些信息(文档字符串、函数定义,也许,我不知道)并将其留在那里,而不是编译或运行它。
如果您正在使用该ast.parse
功能,那么它应该是安全的。如文档所述,此功能将
将源解析为 AST 节点。等价于 compile(source, filename, mode, ast.PyCF_ONLY_AST)
即使文件包含无效的 Python 代码,它也会简单地解析文件。它不做任何类型的评估。
如果您的目标是评估表达式,那么您可以使用ast.literal_eval
,这比内置eval
语句更安全
“不安全”意味着可能会发生由您正在使用的工件控制的不好的事情。由于解析仅构建 AST,并且(假设解析和 AST 构建代码中没有恶意内容),因此解析任意文本不会对您造成伤害。
通常,为了从外部获取恶意行为,某些东西(由你控制)必须基本上执行一些提供的代码。显然构建解析树不会执行外部程序。但是,如果您构建了一个解释器来解释解析树并运行它,那么您可能会遇到问题。
我相信是这样。不执行任何代码。事实上,解析 ast 正是这样ast.literal_eval
做的,这被认为是安全的。