如何利用内置PHP灵活性执行外部程序.doc_第1页
如何利用内置PHP灵活性执行外部程序.doc_第2页
如何利用内置PHP灵活性执行外部程序.doc_第3页
如何利用内置PHP灵活性执行外部程序.doc_第4页
如何利用内置PHP灵活性执行外部程序.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

如何利用内置PHP灵活性执行外部程序在你的电脑上运行下列代码看看出现什么情况?没 有人会怀疑,即使是最苛刻的批评家也 不会怀疑PHP是多功能的:在最近的一次统计中,该语言有1,500多个内置函数和超过150个新增的扩展插件。但是,聪慧的PHP的创作者知道这些还不 足以满足每一个人的要求,所以他们有额外添加了一定的灵活度允许开发者从PHP内部启动他们自己的外部程序,并将所得到的输出再插入PHP应用程序中 所有的一切都不费吹灰之力! 本文将向你介绍一些允许你启动外部程序的PHP函数,向你说明怎样获得输出或在你的PHP脚本中使用结果代码,并提醒你注意过程中潜在的弱点。反引号运算符如果你已经在*NIX中用过Bash shell,那么你一定已经比较熟悉反引号运算符(),它可以用来在Bash脚本内部运行一个外部程序。PHP也正是采用了相同的技术:在PHP脚本 中,简单地将外部程序的命令行放入反引号中,PHP将会在到达该行代码时启动这个外部程序。列表A向你显示了该怎么做。列表A ls -l;?当然,就其本身而言,是没有什么作用 的;多数情况下,你会想要将外部程序的输出引入到你的PHP脚本中进行进一步的处理。幸运的是,这也很简单你要做的就是将反引号中所引的代码当做一个 规则的PHP变量,然后用函数echo()或print()将其显示出来。(列表B)列表B echo Current date and time is: . date;?在本文里,PHP将获得系统命令的输出,然后用echo()将它内插入字符串中。输出如下:Current date and time is: Wed Jun 21 04:27:01 CDT 2006如果你愿意的话,你也可以获得并储存一个外部命令的输出,只需简单地将反引号中所引的命令赋值于一个变量就行了。(列表C)列表C $date = date;echo Current date and time is: $date;?以下是输入:Current date and time is: Wed Jun 21 04:27:01 CDT 2006函数exec()和passthru()当PHP 的安全模式被激活时,反引号运算符就不可用了,这样如果在一个对PHP配置提供有限控制的共享主机上运行你的应用程序的话,就会出现问题。在这种情况下, 你没有其它选择,只能采用两个PHP的内置函数exec()和passthru()了,它们能够提供相似的功能。函数exec()接受单个的包含了要执行命令的必要参数,运行它,然后会返回输出的最后一行。(列表D)列表D echo exec(ls -l);?输出是:drwxr-xr-x 5 user cust 512 Jan 27 2005 vhost大多数情况下,只检索命令的最后一行是不够的,这也是为什么exec()同时提供了两个备选的参数。第一个是一个数组,其中填充着命令得到的输出的每一行;第二个是一个保存命令返回的状态代码的变量。列表E向你展示了一个例子。列表E $data = array(); / define arrayexec(ls -l, $data, $ret); / execute command, output is arrayecho ;if ($ret = 0) / check status code. if successfulforeach ($data as $line) / process array line by lineecho $line ; else echo Error in command; / if unsuccessful display errorecho ; ?这似乎很复杂,但是实际上非常简单。 首先,定义一个空数组$data,调用exec()命令获得一个目录列表。命令返回的代码显示了它是否成功,然后将其储存在$ret中,列表的输出(如果 有的话)储存在前面定义的数组$data中。接下来,返回的代码被检验,如果为0(表示成功了),再用一个foreach()循环来处理数组,并显示目录 列表。如果返回的代码不为0的话,可能会认为发生了一个错误;跳过数组处理,而显示一个错误信息。列表F向你显示了输出。列表Ftotal 90-rw-rr 1 user cust 611 Jul 17 2004 CHANGEdrwxr-xr-x 2 user cust 512 Jul 27 2004 cgidrwxr-xr-x 5 user cust 512 Jan 27 2005 vhost函数passthru()和 exec()类似,除了一点,就是它在被调用时直接将原始的输出返回到浏览器。通常,这只有在你的外部命令的输出是原始二元数据,需要直接输入到解码器中 的时候才有用例如,一个音频流或图象。列表G举例说明了passthru()是如何起作用的。.列表G header(Content-Type: audio/wav); / send MIME headerspassthru(cat hello.wav); / send binary data?潜在的弱点通过PHP脚本执行外部命令始终是一个冒险的建议。如果你的应该程序允许用户输入,那么就会始终存在用户捉弄系统,执行有害命令的危险。为了避免这一点,可以有两种选择:1.避开命令字符串PHP提供了escapeshellcmd()和escapeshellarg()函数,这两个函数会利用引号和反斜线“清除”命令字符串和变量。在将任意的用户输入exec()、passthru()或反引号运算符之前,对它们运行这些命令是一个好办法。(列表H)列表H $cmd = ls / -als & rm -rf /;exec(escapeshellcmd($cmd);?2.利用安全模式另一个选择就是激活PHP的“安全模 式”,来限制什么样的用户可以利用exec()和passthru()。反引号运算符在安全模式下是不可用的,而exec()和passthru()只能 用来执行位于前

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论