使用python的eval()与ast.literal_eval()?

发布于 2021-02-02 23:22:58

我遇到了一些代码,eval()将其作为可能的解决方案。现在,我从来没有使用eval()过,但是,我遇到了很多有关它可能引起的潜在危险的信息。也就是说,我对使用它非常谨慎。

我的情况是我有一个用户输入:

datamap = raw_input('Provide some data here: ')

哪里datamap需要一本字典。我四处搜寻,发现eval()可以解决这个问题。我认为我可以在尝试使用数据之前检查输入的类型,这将是可行的安全预防措施。

datamap = eval(raw_input('Provide some data here: ')
if not isinstance(datamap, dict):
    return

我通读了文档,但仍不清楚这是否安全。eval是否在输入数据后或datamap调用变量后立即评估数据?

该ast模块是.literal_eval()唯一安全的选择吗?

关注者
0
被浏览
118
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    169

    datamap = eval(raw_input('Provide some data here: '))表示你实际上在认为代码不安全之前对其进行了评估。调用该函数后,它将立即评估代码。另请参阅的危险eval。

    ast.literal_eval 如果输入不是有效的Python数据类型,则会引发异常,因此如果输入无效,则不会执行代码。

    使用ast.literal_eval时,你需要eval。通常,你不应该评估文字Python语句。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看