为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

烙印99 2019-06-12 16:40:18
使用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()唯一安全的选择?
查看完整描述

3 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

datamap = eval(raw_input('Provide some data here: '))意味着您实际上对代码进行了评估。以前你认为这是不安全的或不安全的。一旦调用函数,它就会对代码进行评估。另见.的危险eval.

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

使用ast.literal_eval只要你需要eval..通常不应该计算文字Python语句。


查看完整回答
反对 回复 2019-06-12
?
子衿沉夜

TA贡献1828条经验 获得超3个赞

ast.literal_eval()只认为Python语法的一小部分是有效的:

提供的字符串或节点可能只包含以下Python文字结构:字符串、数字、元组、列表、迪克、布尔和无。

过路__import__('os').system('rm -rf /a-path-you-really-care-about')ast.literal_eval()会引起错误,但是eval()会很高兴地擦去你的驱动器。

因为看起来您只允许用户输入一个普通字典,所以请使用ast.literal_eval()..它能安全地做你想做的事,仅此而已。


查看完整回答
反对 回复 2019-06-12
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

Python的殷切在评估中,所以eval(raw_input(...))将评估用户的输入。eval之后不管你如何处理这些数据。因此,这不安全尤其是当你eval用户输入。

使用ast.literal_eval.


例如,在提示符下输入这个内容对您来说非常糟糕:

__import__('os').system('rm -rf /a-path-you-really-care-about')


查看完整回答
反对 回复 2019-06-12
  • 3 回答
  • 0 关注
  • 634 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信