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

ここですでに2つの回答があり、関数に引数を渡すことを提案しているため、関数をオーバーロードすることを考えさせられたので、個人的に別の引数を渡して、それが経由で渡されていないことを示すことができますeval()が、もちろんPHPはそうではありません関数のオーバーロードをサポートします

ただし、オプションのパラメーターを受け入れるように関数を記述してから、 func_num_args() および func_get_arg() を使用して、送信されたものを判別できます。オプションのパラメーターが送信されていない場合は、それが送信されていると簡単かつ安全に想定eval()でき、それに応じて動作させることができます。

于 2012-07-18T08:51:49.883 に答える
0

evalパラメーターとしてパスから呼び出している場合true、次の関数が機能するはずです。

function GetName(isEval = false){
    return isEval ? 'John Doe' : array('John','Doe');
}
于 2012-07-18T08:37:49.853 に答える
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();
于 2012-07-18T09:19:19.530 に答える
0

関数に引数を追加してみませんか? eval の場合は true、そうでない場合は false。

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