猿问

使用python的val()与ast.pacal()?

使用python的val()与ast.pacal()?

我遇到了一些代码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

我读了一遍文档,还不清楚这是否安全。在数据输入后还是在datamap变量被调用?

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


烙印99
浏览 635回答 3
3回答

素胚勾勒不出你

datamap = eval(raw_input('Provide some data here: '))意味着您实际上对代码进行了评估。以前你认为这是不安全的或不安全的。一旦调用函数,它就会对代码进行评估。另见.的危险eval.ast.literal_eval如果输入不是有效的Python数据类型,则引发异常,因此如果不是,则不会执行代码。使用ast.literal_eval只要你需要eval..通常不应该计算文字Python语句。

子衿沉夜

ast.literal_eval()只认为Python语法的一小部分是有效的:提供的字符串或节点可能只包含以下Python文字结构:字符串、数字、元组、列表、迪克、布尔和无。过路__import__('os').system('rm -rf /a-path-you-really-care-about')进ast.literal_eval()会引起错误,但是eval()会很高兴地擦去你的驱动器。因为看起来您只允许用户输入一个普通字典,所以请使用ast.literal_eval()..它能安全地做你想做的事,仅此而已。

犯罪嫌疑人X

Python的殷切在评估中,所以eval(raw_input(...))将评估用户的输入。eval之后不管你如何处理这些数据。因此,这不安全尤其是当你eval用户输入。使用ast.literal_eval.例如,在提示符下输入这个内容对您来说非常糟糕:__import__('os').system('rm -rf /a-path-you-really-care-about')
随时随地看视频慕课网APP

相关分类

Python
我要回答