# [python eval() 函数的妙用和滥用 ]
eval() 函数十分强大,官方 demo 解释为:将字符串 str 当成有效的表达式来求值并返回计算结果:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
>>> 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
|
可以把 list,tuple,dict 和 string 相互转化:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
>>> 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() 函数功能强大,但也很危险,若程序中有以下语句:
|
1
2
|
s``=``raw_input``(``'please input:'``)
print
eval``(s)
|
下面举几个被恶意用户使用的例子:
1》运行程序,如果用户恶意输入:
please input:import(‘os’).system(‘dir’)
则 eval() 之后,当前目录文件都会展现在用户前面。。。
2》运行程序,如果用户恶意输入:
please input:open(‘data.py’).read()
如果,当前目录中恰好有一个文件,名为 data.py,则恶意用户变读取到了文件中的内容。。。
3》运行程序,如果用户恶意输入:
please input:import(‘os’).system(‘del delete.py /q’)
如果,当前目录中恰好有一个文件,名为 delete.py,则恶意用户删除了该文件。。。
/q :指定静音状态。不提示您确认删除。