gpt4 book ai didi

python - literal_eval(f'{}') 会被滥用来执行来自外部源的代码吗?

转载 作者:太空宇宙 更新时间:2023-11-03 11:15:45 33 4
gpt4 key购买 nike

我只是很好奇这是否存在风险,我想不出用户可能导致这种情况发生的方式......但这似乎令人担忧。

>>> import ast
>>> help(ast.literal_eval)
Help on function literal_eval in module ast:

literal_eval(node_or_string)
Safely evaluate an expression node or a string containing a Python
expression. The string or node provided may only consist of the following
Python literal structures: strings, numbers, tuples, lists, dicts, booleans,
and None.

ast.literal_eval(f'{os.remove("dontdelete.txt")-hello-world}') 将执行文件删除。是否存在将其用于应用程序的风险?什么是

"Safely evaluate an expression node"

是什么意思?

最佳答案

原因literal_eval以这种方式定义的是它是 ast 模块中的一个专用函数,而不是设计用于各种其他目的的魔术函数,因此您至少应该略读 ast docs 如果你正在使用它。

literal_eval 可以采用表示已解析表达式的 ast.Node,或者当提供给 ast,parse 时生成的字符串这样的一个节点。

然后,只要表达式只使用“以下 Python 文字结构:字符串、字节、数字、元组、列表、字典、集合、 bool 值和”,它就会计算表达;否则,它将引发错误。


因此,如果您将字符串 'os.remove("dontdelete.txt")-hello-world' 传递给它,那么,当您解析它时,您会得到一个 BinOp 表达式,它不是 literal_eval 接受的表达式节点之一,因此它会立即用 ValueError 拒绝它。


如果你向它传递字符串 """f'{os.remove("dontdelete.txt")-hello-world}'""",当你解析它时,你会得到一个 JoinedStr 表达式节点,里面有一堆 literal_eval 也不接受的节点(值得做一个 ast.dump 来准确查看这些节点是什么,如果你不明白 f-strings 是如何工作的),所以它会再次用 ValueError 拒绝它。


但是,如果您向它传递字符串 f'{os.remove("dontdelete.txt")-hello-world}' 会怎样?

好吧,该字符串在传递给 literal_eval 之前就已经由解释器求值了。

在大多数情况下,这会在调用 literal_eval 之前引发异常,因此 literal_eval 完全无关紧要。例如:

  • 如果 os 没有被导入,你会得到一个 NameError
  • 如果文件不存在,您将得到一个 FileNotFoundError
  • 如果 helloworld 不存在,您将得到一个 NameError
  • 如果 hello 存在但是是任何正常类型的值,因为 remove 返回 None,你会得到一个 TypeError 关于尝试从 None 中减去 hello 的任何类型。

当然,在某些情况下,文件会被删除。但由于 literal_eval 从未被调用过,因此它在这里几乎不相关。您可以使用 print 而不是 literal_eval 来做同样的事情,或者什么都不做。

但是,如果 os 被导入,并且文件存在,并且 hello 是某种类型的实例,带有 __rsub__ 接受 Noneworld 是某种类型的实例,可以传递给返回的任何 hello.__rsub____sub__ ?然后 literal_eval 将被调用,无论 sub 返回什么。如果它是一个字符串或一个 ast.Node,它甚至会计算它。也许那会是其他一些危险的字符串?但在那种情况下,literal_eval 将在该危险字符串上引发 ValueError,因此不会造成额外的伤害。

关于python - literal_eval(f'{}') 会被滥用来执行来自外部源的代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51971570/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com