python中eval函数的使用及安全性问题


Python有很多内置的很有用的工具函数,结合Python的强大的第三方库,熟练的运用这些内置工具有助于事半功倍,之前写工具遇到eval()函数,发现这个函数非常好用,但是慢慢后来通过网上的资料知道eval这个函数其实有利也有弊,函数涉及到一些安全问题,下面就对eval函数的使用和涉及到的安全问题进行讲解。
eval函数的定义:
《python中eval函数的使用及安全性问题》

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

>>> s='8*8'
>>> eval(s)
64
>>> eval('2+5*4')
22
>>> x=1
>>> y=4
>>> eval('x+y')
5
>>> eval('98.9')
98.9
>>> eval('9.9\n')
9.9
>>> eval('9.9\n\t\r  \t\r\n')
9.9

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

>>> l = "[2,3,4,5]"
>>> ll=eval(l)
>>> ll
[2, 3, 4, 5]
>>> type(ll)
<type 'list'>
>>> d="{'name':'python','age':20}"
>>> dd=eval(d)
>>> type(dd)
<type 'dict'>
>>> dd
{'age': 20, 'name': 'python'}
>>> t='(1,2,3)'
>>> tt=eval(t)
>>> type(tt)
<type 'tuple'>
>>> tt
(1, 2, 3)
>>>



eval()函数功能强大,但也很危险,若程序中有以下语句:
s=input(‘please input:’)
print (eval(s))
下面举几个被恶意用户使用的例子:
1》运行程序,如果用户恶意输入:
please input:__import__(‘os’).system(‘dir’)
则eval()之后,当前目录文件都会展现在用户前面。

演示结果:

《python中eval函数的使用及安全性问题》

2》运行程序,如果用户恶意输入:
please input:open(‘data.py’).read()
如果,当前目录中恰好有一个文件,名为data.py,则恶意用户变读取到了文件中的内容。

演示结果:

《python中eval函数的使用及安全性问题》

3》运行程序,如果用户恶意输入:
please input:__import__(‘os’).system(‘del test.txt /q’)
如果,当前目录中恰好有一个文件,名为test.txt,则恶意用户删除了该文件。
/q :指定静音状态。不提示您确认删除。

演示结果:

《python中eval函数的使用及安全性问题》

    原文作者:masserd
    原文地址: https://blog.csdn.net/zoulonglong/article/details/80446373
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞