标题说明了一切
编辑:如果两者都基于zend_eval_string
,这个问题也意味着一个查询
eval和
一样吗?<?php ?>
我一直想知道这是如何解释的。我试着去查,但没查到。当我在网上搜索时,我找不到任何文章来解释它是如何工作的。
对于标记,问题是:
eval();
与
相同<?php
?>
?
eval
用于执行字符串中的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();
');
可以。
但是使用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