Python 3中,ast.literal\u eval(节点或字符串)中是否存在已知的安全漏洞?

Python 3中,ast.literal\u eval(节点或字符串)中是否存在已知的安全漏洞?,python,python-3.x,security,abstract-syntax-tree,Python,Python 3.x,Security,Abstract Syntax Tree,是否有任何已知的方法可以使患者的评估实际上不安全 如果是,是否为其提供修补程序 (我已经知道PyPy[sandbox],它可能更安全,但除非答案是“是”或“否”,否则我的需求很小,所以我不会走那么远。)声明它是安全的,并且在中没有与文本评估安全性相关的bug,因此您可能可以假设它是安全的 此外,literal_eval将字符串解析为python AST(源树),并且仅当它是literal时返回。代码永远不会执行,只会被解析,因此没有理由存在安全风险 >>> code = '()

是否有任何已知的方法可以使患者的评估实际上不安全

如果是,是否为其提供修补程序

(我已经知道PyPy[sandbox],它可能更安全,但除非答案是“是”或“否”,否则我的需求很小,所以我不会走那么远。)

声明它是安全的,并且在中没有与文本评估安全性相关的bug,因此您可能可以假设它是安全的

此外,literal_eval将字符串解析为python AST(源树),并且仅当它是literal时返回。代码永远不会执行,只会被解析,因此没有理由存在安全风险

>>> code = '()' * 1000000
>>> ast.literal_eval(code)
[1]    3061 segmentation fault (core dumped)  python2

或者可能更小的版本将在python2中使用
SIGSEGV
崩溃。在某些条件下,它可能会被利用。Python 3中已经修复了这个特定的bug,但是AST解析器中可能仍然存在bug。

+1这里没有更多答案的原因是不需要再多说了。好吧,很难证明没有风险,但是,代码从未实际执行这一事实应该有助于证明没有太大的风险。风险与使用Python本身差不多。不幸的是,我想使用
ast.literal\u eval()
,以便在将输入传递给
eval()
exec()
之前对其进行过滤,这总是表示风险。但事实上,源代码似乎表明输入是经过严格过滤的。我只是希望我没有错过一个边缘案例……如果输入是一个literal,literal_eval()将返回值。如果输入不仅仅是一个文本(它包含代码),那么literal_eval()将失败,并且在执行代码时存在风险。在这两种情况下,literal_eval()都起作用。为什么要在这之后使用eval()或exec()?您在
literal\u eval
(不是字符串或节点)的参数中使用操作,而与
literal\u eval
@ProdiptaGhosh无关,因为它是字符串。我有一个很好的理由不在这个答案中扩展那一百万个括号!关键是,在调用
literal\u eval
之前,您首先计算一个表达式(字符串乘以了无数次,它是一个表达式,而不是一个字符串),而字符串扩展与
literal\u eval
无关。如果事情进展顺利,它将得到扩展字符串。如果出现错误,python甚至在调用
literal\u eval
之前就崩溃了。这一点似乎是正确的。与
literal\u eval
没有太多关系,但与底层的
parse
compile
调用有关,后者会在超过最大递归限制时出错。这是一个正确的观点。我改变了我的投票。对于更高版本来说,这似乎是一个不错的选择,但是假设您正在使用
literla\u eval(data)
函数,那么不能在前面添加
if len(data)<10000:
来避免这个问题?