0

私はPHPコードを少し持っています(人々がページ、コメント、フォーラム投稿、ブログ投稿などを表示できるようにするCMS(drupalではない)のモジュール機能用...):

if(isset($_GET["m"]))
{
    //Does the module exist and activated, and has it a function called view?
    if(isset($module_exists[$_GET["m"]]) && method_exists($_GET["m"], "view"))//Yep
    {
        //Load view (should be an array)
        eval("$module_view = ".$_GET["m"]."::view();");
        if(!is_array($module_view))//Not an array :(
        {
            error::e500module($_GET["m"], $_SERVER["REQUEST_URI"]);
        }
    }
    else//Nope, so display error
    {
        error::e404($_SERVER['REQUEST_URI']);
    }
}

今、ページを解析するときに次のエラーが発生します。

Notice: Undefined variable: module_view in C:\wamp\www\SYSTEM\start.php on line 34

Parse error: parse error in C:\wamp\www\SYSTEM\start.php(34) : eval()'d code on line 1

Notice: Undefined variable: module_view in C:\wamp\www\SYSTEM\start.php on line 35

しかし、私がするとき:

eval("print_r(".$_GET["m"]."::view());");

それ以外の:

eval("$module_view = ".$_GET["m"]."::view();");

エラーは発生しませんが、単に配列が印刷されました。誰かが私が間違っていることを知っていますか? わかりません。eval() が安全ではないことを私に言わないでください。

ありがとう。

4

2 に答える 2

3

eval を行うべきではありません。これを行う正しい方法は次のとおりです。

$class = $_GET["m"];
$module_view = $class::view();

しかし、ここでも、配列があり、それを含むコードを実行する前に $class が許可されたモジュールであることを確認する必要があります。これはユーザー入力であり、ユーザー入力は信頼できないためです。

$class = $_GET["m"];
if (!in_array($class, $authorized_modules))
{
    header("HTTP/1.1 404 Not Found"); // always good to send a 404 in these cases, so search engines won't index the url
    die("Content not found");
}
$module_view = $class::view();

ご存知のように、エラーは、eval で変数をエスケープする必要があるためです。

eval("\$module_view = ".$_GET["m"]."::view();");

それ以外の場合は、eval() に文字列として渡される前に評価されます。

于 2009-07-24T18:08:11.113 に答える
0

call_user_func()eval() の代わりに使用できます

$module_view = call_user_func(array($_GET["m"], 'view'));

コールバック疑似型のドキュメントを参照してください

于 2009-07-24T18:09:52.343 に答える