是否有可能知道是否从PHP中的eval()内调用该函数?

时间:2012-07-18 08:29:55

标签: php eval

我希望得到一个函数,它将根据它的调用方式返回。

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

说功能如下:

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

是否可以将isEval替换为可以检测是否从eval()内调用?

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

传递参数肯定能够很好地工作,但如上所述,不要因提供该选项而被滥用。

5 个答案:

答案 0 :(得分: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.
    }
}

答案 1 :(得分:0)

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

function GetName(eval){
    if(eval)
       //TODO IF EVAL
    else
       //TODO IF NOT EVAL
}

答案 2 :(得分:0)

当您从eval传递true作为参数进行呼叫时,以下功能应该有效。

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

答案 3 :(得分:0)

鉴于这里已有两个答案,建议将一个参数传递给函数,它让我考虑重载函数,所以你可以亲自传递另一个参数来表明它没有通过{{1}传递但当然PHP doesn't support function overloading

然而你可以编写你的函数来接受一个可选参数,然后使用func_num_args()和func_get_arg()来确定已发送的内容。如果没有发送可选参数,您可以轻松安全地假设它已被eval()编辑,您可以使其相应地采取行动。

答案 4 :(得分: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();