吃饱了撑的!
“; ?>’.”< ?php");
/*Output:
吃饱了撑的!
*/
上面这行代码确实是吃饱了撑的,把原来echo输出的信息交给eval处理再输出。 但仔细一看就会发现其中的蹊跷: 我们交给eval函数的是整句php代码(包括 <?php ?>)。
eval就如其名,让人望而生畏,同时他的强大又不可否认。 使用好eval可以使原本复杂的问题简单化,反之难上加难! 不多唠叨,看代码:
第一个测试
$str = “< ?php echo '我是\$str'; ?>\t加点调料?!@~
“;
echo $str;
/*Output:
< ?php echo '我是$str'; ?> 加点调料?!@~
把php代码原原本本的输出了
*/
eval(” ?>”.$str.”< ?php ");
/*Output:
我是$str 加点调料?!@~
*/
其中有两处输出,echo部分直接解析 $str 字符串, 而eval则再次解析echo输出的内容中的php代码。 所以可以写一个网页加上 eval($_POST[cmd]); 那么你不就可以执行输入的php代码了吗?
下面来看看两个手册上的例子:
第二个测试
$string = ‘cup’;
$name = ‘coffee’;
$str = ‘This is a $string with my $name in it.’;
echo $str.”
“;
eval(“\$str = \”$str\”;”); // 解释$str中的PHP代码
echo $str.”
“; // $str = “This is a $string with my $name in it.”;
/*Output:
This is a $string with my $name in it.
This is a cup with my coffee in it.
*/
eval函数对 $str 字符串加上了双引号,然后使用echo解释输出。关于双引号和单引号的区别请查看手册。
第三个测试: hello
$hello[2][4][6][8][10] = ‘this is a test’; // 5维数组
$w = “[2]“;
$o = “[4]“;
$r = “[6]“;
$l = “[8]“;
$d = “[10]“;
echo ‘hello, ‘.eval(“return \$hello$w$o$r$l$d;”);
// eval负责解释: return $hello[2][4][6][8][10];
/*Output:
hello, this is a test
*/
双引号先把hello前的 ‘\’ 和 $w~d 部分解释掉, 然后eval解释PHP代码;
PHP手册上关于eval函数的解释: http://cn.php.net/eval
eval 函数: 将值代入字符串之中。
语法: void eval(string code_str);
传回值: 无
函式种类: 数据处理
内容说明:
本函式可将字符串之中的变量值代入,通常用在处理数据库的数据上。参数 code_str 为欲处理的字符串。值得注意的是待处理的字符串要符合 PHP 的字符串格式,同时在结尾处要有分号。使用本函式处理后的字符串会沿续到 PHP 程序结束。
顺带提一句,我原先写的那个 长尾巴wp插件,只要加入eval就可以直接在后台往皮肤中加入简单的php代码了^_^
[...] eval函数的功能(这是为了找到替代方案,yo2不允许使用eval函数) [...]