2

我正在寻找一个函数,该函数将根据它的调用方式返回。

如果我从一个 php 类或函数中调用该函数,它将返回一个数组,而如果它是从一个eval()语句中调用的,那么它将返回一个字符串。

说函数如下:

function GetName(){
    return isEval ? 'John Doe' : array('John','Doe');
}

是否可以用某种东西替换 isEval 以检测它是否是从内部调用的eval()

更新:这将成为 CMS 系统的一部分。我需要提供一些已经内置的功能才能公开使用。我知道使用 eval() 会产生安全风险,但仍然想知道是否有可能。

传递参数肯定可以完美地工作,但如上所述,不想通过提供该选项而被滥用。

4

5 回答 5

3

唯一包含您想要的信息的函数是debug_backtrace. 因此,您可以执行以下操作:

function getName(){
    $debug = debug_backtrace();

    //check $debug array. I think it should
    //be in the 2nd element of array:
    if ($debug[1]['function'] == 'eval') { 
       //Do Eval stuff.
    }
}
于 2012-07-18T08:51:13.550 回答
0

为什么不在函数中添加参数?如果 eval 则为 true,否则为 false。

function GetName(eval){
    if(eval)
       //TODO IF EVAL
    else
       //TODO IF NOT EVAL
}
于 2012-07-18T08:32:57.360 回答
0

当您从evalpasstrue作为参数调用时,以下函数应该可以工作。

function GetName(isEval = false){
    return isEval ? 'John Doe' : array('John','Doe');
}
于 2012-07-18T08:37:49.853 回答
0

鉴于这里已经有两个答案,建议将参数传递给函数,这让我想到了重载函数,所以你可以亲自传递另一个参数来表明它不是通过 an 传递的,eval()但当然PHP 不会支持函数重载

但是,您可以编写函数来接受可选参数,然后使用 func_num_args() 和 func_get_arg() 来确定已发送的内容。如果未发送可选参数,您可以轻松安全地假设它正在被eval()'ed 并且您可以使其相应地采取行动。

于 2012-07-18T08:51:49.883 回答
0
function isEval()
{
    foreach(array_reverse(debug_backtrace()) as $v) {
        return $v['function'] === 'eval';
    }
}

function isEval() { // updated by code90
    foreach(array_reverse(debug_backtrace()) as $v) {
        if($v['function'] === 'eval') return true;
    }

    return false; }


function myFunc()
{
    return isEval() ? "is eval\n" : "is not eval\n";
}

function callAnotherFunction()
{
    return myFunc();
}

function myFunctionWithEval()
{
    eval('$return = myFunc();');
    return $return;
}

测试

echo "myFunc() without eval: " . myFunc();
eval("echo 'myFunc() whit eval: ' . myFunc();");

echo "callAnotherFunction() without eval: " . callAnotherFunction();
eval("echo 'callAnotherFunction() with eval: ' . callAnotherFunction();");

echo 'myFunctionWithEval() with eval: ' . myFunctionWithEval();

输出

myFunc() without eval: is not eval
myFunc() whit eval: is eval
callAnotherFunction() without eval: is not eval
callAnotherFunction() with eval: is eval
myFunctionWithEval() with eval: is not eval <--- PROBLEM!

myFunctionWithEval 使用 eval 调用 myFunc。你不能保证它什么时候被调用 eval。可以给出假阳性。

你应该考虑另一种方法来进行。不应该使用这种方法!

另一种选择,但我始终建议不要使用

function isEval()
{
    return isset($GLOBALS['__MyEval']) && $GLOBALS['__MyEval'] === true;
}

function myFunc()
{
    return isEval() ? "is eval\n" : "is not eval\n";
}

function myFunctionWithEval()
{
    $GLOBALS['__MyEval'] = true;
    eval('$return = myFunc();');
    $GLOBALS['__MyEval'] = null;

    return $return;
}

echo "myFunctionWithEval() with eval: " . myFunctionWithEval();
于 2012-07-18T09:19:19.530 回答