标题说明了一切...
编辑:如果两者都基于 zend_eval_string
eval 的作用是否与
相同<?php ?>
我一直想知道如何解释这一点。我试图查找它,但没有运气。当我在网上搜索时,我找不到任何可以准确解释其工作原理的文章。
再次使用标记,问题是:
eval();
同
<?php
?>
?
答案 0 :(得分:2)
eval
用于从 String 执行 PHP 代码。
如果您在谈论使用 <?php
标记,您已经编写了代码,但是使用 eval
您可以从变量或生成的动态代码执行代码。
最重要的是:您永远应该使用 eval
函数和用户输入!这是一个严重的安全问题。
例如以下代码:
<?php
function test() {
echo "Hi";
}
test();
?>
将产生与以下相同的结果:
<?php
$script = 'function test() {';
$script .= ' echo "Hi";';
$script .= '}';
$script .= 'test();';
eval($script);
或:
<?php
eval('
function test() {
echo "Hi";
}
test();
');
答案 1 :(得分:0)
是的。
但使用 eval()
会开启注入攻击:
<?php
eval('echo "'.$_GET['text'].'"; ');
?>
类似于SQL注入,用户可以输入
a"; unlink('index.php'); //
或者甚至更邪恶的东西:
a"; system('rm -rf /'); //
删除 index.php。
否则,它是一样的。 不要使用eval()
,除非您绝对确定用户无法完成语句!
如果要执行名称为 string
的函数或从将属性名称指定为 string
的对象加载属性,则无需 eval()
即可执行此操作:
<?php
class myClass {
function __construct() {
echo __CLASS__." is being created!\n";
}
function __destruct() {
echo __CLASS__.' under destruction...';
}
public $a = 3;
public function hello() {
echo 'hello'."\n";
}
}
function sayBye() {
echo 'bye'."\n";
}
$string = 'sayBye';
$string(); // executes sayBye
$obj = new myClass();
$prop = 'b';
$obj->$prop(); // calls $obj->hello()
$prop = 'a';
echo $obj->$prop; // 3