2012-06-18 37 views
1

這是我第一次嘗試創建frontController,並且我遇到了一些小問題。__autoload:Escape ClassName

首先讓我給你的印象我的網站看起來像: 當我在瀏覽器中打開http://mysite.com/test,服務器將調用帶有GET參數$控制器(測試)的index.php文件。這是通過.htaccess完成的。 在index.php中應該創建一個類$控制器的實例。 爲此,我使用PHP的__autoload函數。 因此,代碼如下所示:

$controller = $_GET["controller"]; 

function __autoload($controller) 
{ 
    include("controllers/$controller.php"); 

    if(!class_exists($controller, false)) 
    { 
     eval 
     (' 
      class '. $controller . ' 
      { 
       public function __construct() 
       { 
        include("404.html"); 
        exit(); 
       } 
      } 
     '); 
    } 
} 


$application = new $controller; 

當你看着我提供你可能已經注意到在它的的eval()啄的代碼。 我使用它來避免$ controller類不存在時的致命錯誤,並顯示一個404而不是它。

這裏開始的樂趣:,當有人進入像

http://mysite.com/ImATroll!:D

的URL

會有

Parse error: syntax error, unexpected '!'

而且......

Fatal error: Class 'ImATroll!:D' not found

所以問題是:如何c我抓住了這個?我怎樣才能轉義$控制器變量的方式,它只包含允許類名稱的字符?

+0

谷歌的'網址驗證'的第一個結果告訴你如何做到這一點 –

+0

http://validator.w3.org/checklink 這將如何幫助我?雖然點在URL中有效,但它不在類名中。 – iceteea

+0

好吧,這是我得到的第一個結果: http://phpcentral.com/208-url-validation-in-php.html –

回答

1

實際上,您可以從自動加載功能中引發異常(請使用spl_autoload_register代替)。

這個異常是可捕獲的,所以你可以提供'默認'功能。

這是迄今爲止最好的方法,但是如果你堅持創建這個假控制器,你應該使用class_alias來代替。

4

我只是簡單地下降eval部分,並在該部分直接重定向到404。 (非動態)404 - ContentNotFoundController如果你想要的,只需使用/ yield that(當類名不存在時)。

+0

有時生活可以是如此簡單! 下面的教程#30,我沒有看到樹木。 – iceteea

2

在調用new $controller;(class_exists將調用自動加載函數)之前,爲什麼不嘗試class_exists,如果爲false,則包含('404.html');

function __autoload($classname){ 

    $file = "controllers/$classname.php"; 
    if(is_file($file)) 
    include_once($file); 

} 

...但要小心安全問題 - 如傳入?controller = ../htpasswd。你應該通過刪除所有非字母數字字符消毒類名 - 像$classname = preg_replace('/[^A-Za-z0-9]/', '', $classname);

+0

class_exists在我看來有兩個好處: 當它包含一個文件,其中缺少所需的類時,不會發生致命錯誤。 第二個是你提到的安全問題。 但謝謝你的回答! – iceteea

1

只需創建類的類未發現:

if(!class_exists($controller, false)) 
{ 
    $controller = "NotFound"; 
    include("controllers/NotFoundController.php"); 
} 

你可以被允許,並檢查也白名單控制器與in_array()是否承認類名。這樣做的缺點是,您必須爲添加的每個課程更改白名單。

你也可以編寫一個過濾可能的類名的正則表達式。

相關問題