PHP:eval 和 <?php 一样吗>

  • 本文关键字:一样 eval PHP php php
  • 更新时间 :
  • 英文 :


标题说明了一切

编辑:如果两者都基于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

最新更新