Chinaunix首页 | 论坛 | 博客
  • 博客访问: 499386
  • 博文数量: 74
  • 博客积分: 750
  • 博客等级: 军士长
  • 技术积分: 1453
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-29 15:59
文章分类
文章存档

2014年(30)

2013年(8)

2012年(36)

分类: Python/Ruby

2012-10-08 11:25:49

eval_r(str [,globals [,locals ]])函数将字符串str当成有效Python表

达式来求值,并返回计算结果。

同样地, exec语句将字符串str当成有效Python代码来执行.提供给exec的代码的名称空间和exec语句的名称空间相同.

最后,execfile(filename [,globals [,locals ]])函数可以用来执行一个文件,看下面的例子:

>>> eval_r('3+4')
        7
        >>> exec 'a=100'
        >>> a
        100
        >>> execfile(r'c:\test.py')
        hello,world!
        >>>
默认的,eval_r(),exec,execfile()所运行的代码都位于当前的名字空间中. eval_r(), exec,和 execfile()函数也可以接受一个或两个

可选字典参数作为代码执行的全局名字空间和局部名字空间. 例如:

切換行號
   1 globals = {'x': 7,
   2            'y': 10,
   3            'birds': ['Parrot', 'Swallow', 'Albatross']
   4           }
   5 locals = { }
   6
   7 # 将上边的字典作为全局和局部名称空间
   8 a = eval_r("3*x + 4*y", globals, locals)
   9 exec "for b in birds: print b" in globals, locals   # 注意这里的语法
10 execfile("foo.py", globals, locals)

如果你省略了一个或者两个名称空间参数,那么当前的全局和局部名称空间就被使用.如果一个函数体内嵌嵌套函数或lambda匿名函数

时,同时又在函数主体中使用exec或execfile()函数时, 由于牵到嵌套作用域,会引发一个SyntaxError异常.(此段原文:If you

omit one or both namespaces, the current values of the global and local namespaces are used. Also,due to issues

related to nested scopes, the use of exec or execfile() inside a function body may result in a SyntaxError exception

if that function also contains nested function definitions or uses the lambda operator.)

在Python2.4中俺未发现可以引起异常 --WeiZhong
注意例子中exec语句的用法和eval_r(), execfile()是不一样的. exec是一个语句(就象print或while), 而eval_r()和execfile()则是内

建函数.

exec(str) 这种形式也被接受,但是它没有返回值。 --WeiZhong
当一个字符串被exec,eval_r(),或execfile()执行时,解释器会先将它们编译为字节代码,然后再执行.这个过程比较耗时,所以如果需要

对某段代码执行很多次时,最好还是对该代码先进行预编译,这样就不需要每次都编译一遍代码,可以有效提高程序的执行效率。

compile(str ,filename ,kind )函数将一个字符串编译为字节代码, str是将要被编译的字符串, filename是定义该字符串变量的文

件,kind参数指定了代码被编译的类型-- 'single'指单个语句, 'exec'指多个语句, 'eval'指一个表达式. cmpile()函数返回一个代

码对象,该对象当然也可以被传递给eval_r()函数和exec语句来执行,例如:

切換行號
   1 str = "for i in range(0,10): print i"
   2 c = compile(str,'','exec')      # 编译为字节代码对象
   3 exec c                          # 执行
   4
   5 str2 = "3*x + 4*y"
   6 c2 = compile(str2, '', 'eval') # 编译为表达式
   7 result = eval_r(c2)               # 执行

Python的eval()函数可以把字符串“123”变成数字类型的123,PP3E上说它很危险,还可以执行其他命令!

在家没事,做了些试验。果然,如果python写的cgi程序中如果使用eval()而非int()来转换诸如年龄这样的输入框中的内容时是非常危险的。不仅可以看见列出系统的全部文件,还可以删除文件,察看文件源代码。

试着写了个程序,想把本地的脚本文件同过这样的形式一行一行的写到服务器的某个文件里,可最后失败在无法输入换行符"\n",在提交的语句里只要有换行符,就会出现EOL的出错提示,换了编码方式还是没能成功。

 
网页里有一个提交名字的窗口,这里只是以改它为例,否则名字是不会用eval函数转换的,不过年龄到是很容易出问题。这个文件()导入了os。

line1 = "Hello, %s." % eval(form['user'].value)

(1)os.system(‘del * /q’) #删除当前目录下所有文件(不包括文件夹)。
os.system调用当前系统的命令(如windows)
/q 
指定静音状态。不提示您确认删除。

(2)若删除文件夹,使用rmdir
/s 
删除指定目录和所有子目录以及包含的所有文件。使用 /s 来删除目录树。
/q 
在安静模式中运行 rmdir。不经确认即删除目录。
os.system(‘rmdir d:\workspace /s/q’)
(3)列出所有文件os.system(‘dir’)。因为成功执行了dir命令后,系统返回0,所以看到的返回内容只能是Hello,0.而在服务器上,倒是真的列出来了,如果有日志,可能被发现。提交os.system(‘dir >dir.txt’),那么访问,所有的文件和文件夹都暴露了,想看源代码吗?如果再使用os.system(‘type target.py’).命令如果成功完成同样会返回Hello, 0.的。难道再放进一个文件,再访问那个文件吗?open(‘target.py’).read()
由此,可以在列出和察看其他文件夹里面的内容了。
如果没干别的坏事,那么可删除dir.txt以免被人发现了。os.system(‘del dir.txt /q’)

导入os并执行命令:
__import__(‘os’).system(‘dir >dir.txt’)


阅读(7428) | 评论(0) | 转发(0) |
0

上一篇:运算符的优先级

下一篇:python中的open函数

给主人留下些什么吧!~~