# [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 :指定静音状态。不提示您确认删除。