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

你不应该做任何评估。这是执行此操作的正确方法:

$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 回答