python3 eval安全替代函数ast.literal

一、eval函数

eval()官方文档里面给出来的功能解释是:将字符串string对象转化为有效的表达式参与求值运算返回计算结果。

示例:

  1. >>> s='8*8'
  2. >>> eval(s)
  3. 64
  4. >>> eval('2+5*4')
  5. 22
  6. >>> x=1
  7. >>> y=4
  8. >>> eval('x+y')
  9. 5
  10. >>> eval('98.9')
  11. 98.9
  12. >>> eval('9.9\n')
  13. 9.9
  14. >>> eval('9.9\n\t\r \t\r\n')
  15. 9.9

最有用的一个是eval可以将字符串转换成字典,列表,元组

  1. >>> l = "[2,3,4,5]"
  2. >>> ll=eval(l)
  3. >>> ll
  4. [2, 3, 4, 5]
  5. >>> type(ll)
  6. <type 'list'>
  7. >>> d="{'name':'python','age':20}"
  8. >>> dd=eval(d)
  9. >>> type(dd)
  10. <type 'dict'>
  11. >>> dd
  12. {'age': 20, 'name': 'python'}
  13. >>> t='(1,2,3)'
  14. >>> tt=eval(t)
  15. >>> type(tt)
  16. <type 'tuple'>
  17. >>> tt
  18. (1, 2, 3)

eval()函数功能强大,但也很危险,若程序中有以下语句:

  1. s=input('please input:')
  2. print (eval(s))

下面举几个被恶意用户使用的例子:

1、运行程序,如果用户恶意输入:

please input:__import__('os').system('ls')

eval()之后,当前目录文件都会展现在用户前面。
演示结果:

2、运行程序,如果用户恶意输入:

please input: open('xxx.py').read()

如果,当前目录中恰好有一个文件,名为data.py,则恶意用户变读取到了文件中的内容。

3、运行程序,如果用户恶意输入:

please input:__import__('os').system('del test.txt /q')

如果,当前目录中恰好有一个文件,名为test.txt,则恶意用户删除了该文件。/q :指定静音状态。不提示您确认删除。

二、ast.literal_eval方法

ast.literal_eval是python针对eval方法存在的安全漏洞而提出的一种安全处理方式。

简单点说ast模块就是帮助Python应用来处理抽象的语法解析的。而该模块下的literal_eval()函数:则会判断需要计算的内容计算后是不是合法的Python类型,如果是则进行运算,否则就不进行运算。

比如下面查看系统文件的操作就会被拒绝,而只会执行合法的python类型,从而大大降低了系统的危险性

  1. import ast
  2. res = ast.literal_eval('1 + 1')
  3. print(res)
  4. # 2
  5. res = ast.literal_eval('[1, 2, 3, 4]')
  6. print(type(res))
  7. # <class 'list'>
  8. print(res)
  9. # [1, 2, 3, 4]
  10. res = ast.literal_eval("__import__('os').system('ls')")
  11. # 报错如下:
  12. Traceback (most recent call last):
  13. File "<stdin>", line 1, in <module>
  14. File "/Users/didi/.pyenv/versions/3.6.4/lib/python3.6/ast.py", line 85, in literal_eval
  15. return _convert(node_or_string)
  16. File "/Users/didi/.pyenv/versions/3.6.4/lib/python3.6/ast.py", line 84, in _convert
  17. raise ValueError('malformed node or string: ' + repr(node))
  18. ValueError: malformed node or string: <_ast.Call object at 0x10e63ca58>

所以出于安全考虑,对字符串进行类型转换的时候,最好使用ast.literal_eval()

(0)

相关推荐

  • python世界中形影不离的一对情侣

    文末附有项目代码可供下载 input函数 input()是从控制台获取用户输入的信息,不论用户输入的是什么,input()都会返回字符串类型.<变量> = input(<提示性文字& ...

  • 14道python练习题,通俗易懂小白都能轻松上手(附答案)

    14道python练习题,通俗易懂小白都能轻松上手(附答案)

  • 听说你在玩 Python 爬虫遇到 JavaScript 的时候还在使用 selenium ?

    我们在玩爬虫的时候 对于一些没做什么反爬的网站来说 使用简单的库 三两下就能把数据爬取下来了 不过 对于一些别人认为 比较重要的数据来说 可就没有那么容易了 他们认为这些数据很重要 但是又不得不展示给 ...

  • Python中关于eval函数与ast.literal

    eval函数在Python中做数据类型的转换还是很有用的.它的作用就是把数据还原成它本身或者是能够转化成的数据类型.那么eval和ast.literal_val()的区别是什么呢?本文将大家介绍关于P ...

  • UC头条:竟然可以这样学python! !

    本人最近刚刚学习了python,想要了解python的朋友可以跟我一起学哦~ 点击加载图片 先来个最简单的程序 print('Hello World!') 其实python也是支持中文版的,可以直接使 ...

  • 小姨开水果店的,所以今天用Python写了一个水果店小系统!

    前言 今天晚上才刚下班,小姨就提了我最爱吃的榴莲过来,说不吃就坏了. 我一眼就看破了她的用意,哈哈哈  我这个小姨也是一起长大的,她心里的小九九  我在清楚不过了!肯定是有求于我!  然后就直接问他有 ...

  • Python基础教程(补中秋的文章)

    千千万万之状容兮,不可得而状也 小马 身份运算符 身份运算符用于比较两个对象是否为同一个对象.身份运算符共有两个:is和is not. Python身份运算符的使用语法如下: obj1 is [not ...

  • 谁说不能用中文写代码?

    现代计算机和编程的起源和推动力量主要源自美国,再加上26个字母很便于表示(算上大小写,6位bit就够了),因此英语一直是编程领域的不二之选.但这就给部分非英语国家的编程学习者带来一些困扰.以至于有些人 ...

  • PYthon继承链(egg)的思考和实战

    前言  起初学习ssti的时候,就只是拿着tplmap一顿乱扫,然后进行命令执行,之前深入学习了一下PYthon继承链:今天写个文章进行加深记忆和理解. 基础知识 class 返回一个实例所属的类: ...

  • Python之woe:woe库的简介、安装、使用方法之详细攻略

    Python之woe:woe库的简介.安装.使用方法之详细攻略 woe库的简介 woe转换工具主要用于信用评级的记分卡模型.在woe中,对变量进行分箱的原理类似于二叉决策树,其中决定如何划分的目标函数 ...

  • python新手用pyinstaller -F - w test.py打包后的exe无法运行

    python新手用pyinstaller -F - w test.py打包后的exe无法运行 置顶 风很大很大 2020-03-15 09:46:46  1662  收藏 3 分类专栏: 笔记 版权 ...

  • python笔记22-literal_eval函数处理返回json中的单双引号

    前言 在做接口测试的时候,最常见的接口返回数据就是json类型,json类型数据实际上就是字串,通常标准的json格式是可以转化成python里面的对应的数据类型的 有时候开发返回的数据比较坑,不按常 ...