2009-07-24 5 views
0

У меня есть немного PHP-кода (для функции модуля моей CMS (не drupal), которая позволяет людям просматривать страницы, комментарии, сообщения на форуме, сообщения в блогах и т. Д.) ... :Ошибка PHP eval при присвоении значения переменной

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() небезопасен, я знаю.

Спасибо.

ответ

3

Вы не должны делать никаких оценок. Вот правильный способ сделать это:

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

Но даже здесь, вы должны иметь массив и проверить, что $ класс является авторизированным модулем перед выполнением какого-либо кода, содержащего его, так как это пользовательский ввод и ввод пользователя может» т доверять:

$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();"); 

Else это оценивается, прежде чем он дал в виде строки к eval().

+0

Thanx Я не знал, что я должен избежать. – 2009-07-24 18:09:11

+0

Другой вариант - использовать одинарные кавычки. –

+0

Но мне нравятся двойные кавычки ;-) – 2009-07-24 18:10:03

 Смежные вопросы

  • Нет связанных вопросов^_^