PHP eval hata değişkene değer atarken

2 Cevap php

Ben (insanlar, vb sayfaları, yorum, forum mesajları, blog yazılarını görmek için izin verir benim CMS (drupal değil) .. modül özelliği için) PHP kod biraz var:

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']);
    }
}

Sayfa ayrıştırma Şimdi, ben bu hataları alıyorum:

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

Ama ne yaparım:

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

yerine:

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

Ben herhangi bir hata alamadım, ama sadece dizi basılmış. Herkes yanlış yaptığımı biliyor mu? Ben bunu anlamıyorum. () Güvenli değil bana eval söylemeyin lütfen, ben biliyorum.

Teşekkürler.

2 Cevap

Herhangi bir muayene yapmak asla. İşte bunu yapmak için doğru yolu:

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

Ama burada bile, bir dizi var ve kullanıcı girişi ve giriş güvenilir olamaz kullanıcı olduğu gibi bu $ sınıf, bunu içeren herhangi bir kod yürütmeden önce yetkili bir modül kontrol etmelisiniz:

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

Eğer eval içinde değişken kaçmak zorunda çünkü sadece çok bilirsin, hatadır:

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

Bu eval bir dize () olarak verdi önce başka değerlendirilecek oluyor.