源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Python中函数eval和ast.literal_eval的区别详解

  • 时间:2020-04-12 16:15 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Python中函数eval和ast.literal_eval的区别详解
[b]前言[/b] 众所周知在Python中,如果要将字符串型的list,tuple,dict转变成原有的类型呢? 这个时候你自然会想到eval. eval函数在python中做数据类型的转换还是很有用的。它的作用就是把数据还原成它本身或者是能够转化成的数据类型.下面来看看示例代码: [b]string <==> list[/b] [img]http://files.jb51.net/file_images/article/201708/2017810110537865.jpg?201771011546[/img] [b]string <==> tuple[/b] [img]http://files.jb51.net/file_images/article/201708/2017810110612407.jpg?201771011620[/img] [b]string <==> dict[/b] [img]http://files.jb51.net/file_images/article/201708/2017810110642854.jpg?201771011651[/img] 也就是说,使用eval可以实现从元祖,列表,字典型的字符串到元祖,列表,字典的转换,此外,eval还可以对字符 串型的输入直接计算。比如,她会将'1+1'的计算串直接计算出结果。 [img]http://files.jb51.net/file_images/article/201708/2017810110715610.jpg?201771011722[/img] 从上面来看,eval功能可谓非常强大,即可以做string与list,tuple,dict之间的类型转换,还可以做计算器使用!更有甚者,可以对她能解析的字符串都做处理,而不顾忌可能带来的后果!所以说eval强大的背后,是巨大的安全隐患!!! 比如说,用户恶意输入下面的字符串 [code]open(r'D://filename.txt', 'r').read()[/code] [code]__import__('os').system('dir')[/code] [code]__import__('os').system('rm -rf /etc/*')[/code] 那么eval就会不管三七二十一,显示你电脑目录结构,读取文件,删除文件.....如果是格盘等更严重的操作,她也会照做不误!!! [b]所以这里就引出了另外一个安全处理方式ast.literal_eval.可以先看下stackoverflow及Python官方关于这个解释![/b] [b]stackoverflow[/b] [img]http://files.jb51.net/file_images/article/201708/2017810110827505.jpg?201771011835[/img] [b]Python官方文档[/b] [img]http://files.jb51.net/file_images/article/201708/2017810110900082.jpg?20177101198[/img] 简单点说ast模块就是帮助Python应用来处理抽象的语法解析的。而该模块下的[code]literal_eval()[/code]函数:则会判断需要计算的内容计算后是不是合法的python类型,如果是则进行运算,否则就不进行运算。 比如说上面的计算操作,及危险操作,如果换成了[code]ast.literal_eval() [/code],都会拒绝执行。 报值错误,不合法的字符串! [img]http://files.jb51.net/file_images/article/201708/2017810110945246.jpg?201771011954[/img] 而只会执行合法的Python类型,从而大大降低系统的危险性! [img]http://files.jb51.net/file_images/article/201708/2017810111008173.jpg?2017710111018[/img] 所以出于安全考虑,对字符串进行类型转换的时候,最好使用[code]ast.literal_eval()[/code]函数! [b]总结[/b] 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对编程素材网的支持。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部