2012-07-18 131 views
2

我正在想出一个函数,它将根据它的调用方式返回。是否有可能知道该函数是否在PHP中的eval()中调用?

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

说的功能是:

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

是否有可能与一些替代isEval来检测,如果它是从eval()内叫什么名字?

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

传入参数肯定能正常工作,但如上所述,不想因提供该选项而被滥用。

+0

我认为它最容易传递一个参数:'功能的GetName($格式)' – 2012-07-18 08:32:52

+0

如果你给的大局观,我很确定有一种方法可以避免函数返回两个不同的值,并且完全使用eval。 – JJJ 2012-07-18 08:34:23

+2

我不确定,但我确信你不应该使用'eval()'。 – Leri 2012-07-18 08:34:29

回答

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. 
    } 
} 
+0

刚刚尝试过这种方法并发挥了魅力。好的电话,非常感谢! – code90 2012-07-18 08:57:28

+0

不客气。 :-) – Leri 2012-07-18 08:58:07

+1

@PLB OMG,你愿意嫁给我吗? :) – Fluffeh 2012-07-18 09:01:49

0

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

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

当你从evaltrue作为参数调用,下面的函数应该工作。

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

这里给出两个答案已经,这传递参数的功能,它让我思考过载功能,所以你可以亲自传递另一种说法表明它没有通过eval()传递,当然还有PHP doesn't support function overloading

但是您可以编写函数来接受可选参数,然后使用func_num_args()和func_get_arg()来确定已发送的内容。如果没有发送可选参数,则可以轻松安全地假定它是eval()'ed,并且可以使其适用。

+0

问题是我不想做出任何假设。 PLB的解决方案适用于这种情况。不管怎么说,还是要谢谢你。 – code90 2012-07-18 08:59:33

+0

@ code90是的,我在你接受之前提出了他的答案,我不知道你能做到这一点 - 因此我也+回复了这个问题,因为我学到了一些有用的东西,以后可以回头参考。 – Fluffeh 2012-07-18 09:00:59

+0

这就是这个网站的美丽。每个人都放置并获得一些东干杯... – code90 2012-07-18 09:02:23

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调用myFunc的与EVAL。您无法保证它何时被称为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(); 
+0

您表示为问题的行实际上不是来自eval()调用。 ??? – code90 2012-07-18 09:41:04

+0

myFunctionWithEval使用eval调用myFunc。你不能保证它什么时候被称为eval.can给出误报 – Federkun 2012-07-18 09:44:10

+0

我明白你的观点,并且需要运行你的测试代码来查看问题。似乎您想出的函数isEval()可能需要一些改进才能准确检测。 – code90 2012-07-18 09:50:57

相关问题