- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我只是很好奇这是否存在风险,我想不出用户可能导致这种情况发生的方式......但这似乎令人担忧。
>>> 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
。hello
或 world
不存在,您将得到一个 NameError
。hello
存在但是是任何正常类型的值,因为 remove
返回 None
,你会得到一个 TypeError
关于尝试从 None
中减去 hello
的任何类型。当然,在某些情况下,文件会被删除。但由于 literal_eval
从未被调用过,因此它在这里几乎不相关。您可以使用 print
而不是 literal_eval
来做同样的事情,或者什么都不做。
但是,如果 os
被导入,并且文件存在,并且 hello
是某种类型的实例,带有 __rsub__
接受 None
,world
是某种类型的实例,可以传递给返回的任何 hello.__rsub__
的 __sub__
?然后 literal_eval
将被调用,无论 sub
返回什么。如果它是一个字符串或一个 ast.Node
,它甚至会计算它。也许那会是其他一些危险的字符串?但在那种情况下,literal_eval
将在该危险字符串上引发 ValueError
,因此不会造成额外的伤害。
关于python - literal_eval(f'{}') 会被滥用来执行来自外部源的代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51971570/
我正在使用 ast.literal_eval(str) 评估包含元组的字符串,例如 ('a', 'b', 'c')。然而,如果由于某种原因这个元组只包含一个元素,表达式将忽略括号并只返回元素: >>>
集合不可散列,因为它们是可变的。但是有没有办法仍然在 {1, 2, {3, 4}} 上使用literal_eval?我只想知道外部结构是一个集合,我不关心内部类型,但集合内的集合是可能的输入。 更新:
我已经从librosa库中提取了数据集。 This is top five data. These are the total columns. 这些数据为对象格式。 It has got '\n'
我正在使用 ast.literal_eval 将我从 json.loads() 收到的数据更改为 Python 字典;但是,如果我应该以一种完全不同的方式来解决这个问题 - 请随时指出这一点。 # A
目标:我想从下面的 request.POST 中提取 map 键中的 longlat 元组。 问题:我使用 ast.literal_eval 提取元组,但不知何故只返回第二个元组。 markers
ast.literal_eval() 是否适用于字典列表?对我来说,它给出了格式错误的字符串错误? [[u'ABN', u'12', u'', 2.69, u'222.222.222.222', u'
我收到格式错误的字符串错误。 这是我的测试 >>> eval("'Hello:: '+'fdsfds'") 'Hello:: fdsfds' >>> import ast >>> ast.litera
我在使用 ast.literal_eval() 时遇到了问题。在下面的示例中,我只想将字符串 (myText) 转换为字典。但是 ast.literal_eval() 尝试评估 并给我一个错误。我完全
这个问题在这里已经有了答案: can anyone tell me what i'm doing wrong? ast.literal_eval malformed node or string p
好吧... Unicode 字符串被编码为 Python 2.x 字符串(实际上是字节序列) Python 2.x 字符串被解码为 Unicode 字符串 Python UnicodeDecodeEr
运行 python 程序时出现以下错误。我使用的是 python 3.4,我已经安装了 Ferenda-0.1.7-py3.4,错误是: File "C:\Python34\lib\site-pack
我只是很好奇这是否存在风险,我想不出用户可能导致这种情况发生的方式......但这似乎令人担忧。 >>> import ast >>> help(ast.literal_eval) Help on f
我对相同的数据使用了 json dump 然后 json load。数据是 unicode 所以我把它转换成字符串。使用 ast.literla_eval 我试图获取要听写的字符串的类型,但出现错误
我是 python 的新手,尝试使用 ast.literal_eval 获取请求数据导致“语法无效”错误。 它打印我发送的数据,格式如下, 192.156.1.0,8181,database,admi
我有一个字符串 "{'datetime': datetime.datetime(2010, 11, 21, 0, 56, 58)}" 我想将其转换为它所代表的对象。使用 ast.literal_eva
我正在尝试从文件中读取元组的字符串表示形式,并将元组添加到列表中。这是相关代码。 raw_data = userfile.read().split('\n') for a in raw_data :
我遇到了这个代码并且它有效,但我不完全确定 何时使用 ast 和 是否存在性能问题当使用它而不是从 input() 获取字符串值时并将其转换为int。 import ast cyper_key = a
或者另一种方式来询问我想是否有一个文字将 literal_eval 转换为范围函数的等价物(不将整个数组作为范围发送)。 以下 import ast ast.literal_eval("range(0
假设我有一个文件 example.py: 导入示例 VVV = 2 DictionaryNameB = { 'a' : VVV, 'bb'
ast.literal_eval(node_or_string) 有什么已知的方法吗?的评估实际上并不安全? 如果是,是否有可用的补丁? (我已经知道 PyPy[sandbox],它可能更安全,但除非
我是一名优秀的程序员,十分优秀!