2012-05-05 84 views
1

這是安全的嗎?或者是否有可能使用一些RFI/LFI或者它叫什麼?安全包括php

$request_uri = explode('/', $_SERVER['REQUEST_URI']); 
$script_name = explode('/', $_SERVER['SCRIPT_NAME']); 

for ($i = 0; $i < sizeof($script_name); $i++) { 
    if ($request_uri[$i] == $script_name[$i]) 
    { 
     unset($request_uri[$i]); 
    } 
} 

$command = array_values($request_uri); 

if (file_exists('controllers/' . $command[0] . '.php')) { 
    include 'controllers/' . $command[0] . '.php'; 
} 

更新:

if (isset($_GET['p'])) { 
    $pages = array('home', 'login', 'register'); 
    $page = filter_var($_GET['p'], FILTER_SANITIZE_URL); 

    if (in_array($page, $pages) && file_exists($page . '.php')) { 
     include ($page . '.php'); 
    } else { 
     include ('404.php'); 
    } 
} 
else { 
    include ('home.php'); 
} 
+0

至少所有可讀的PHP文件在一個或其他目錄中可以很容易地讀取。 – hakre

+1

不使用該代碼。 – goat

回答

1

那麼,如果你確保$command[0]只包含字母數字字符(以及可能的下劃線和連字符),那麼可能有點安全。

像下面可能做的工作:

if (!ctype_alnum($command[0])) { 
    // Hacking attempt! 
    exit; 
} 

但它仍然是一個壞主意,包括基於用戶輸入的文件。更好的方法是使用將URI映射到控制器的查找表,並使用自動加載來包含相關文件。這樣,用戶輸入和包含之間就有了很大的分離。

+0

這個怎麼樣:(檢查問題) } – John

+0

你的更新看起來更好。 'filter_var()'是多餘的,因爲你正在檢查白名單。 – kijin

+0

我只是好奇爲什麼頁面無法找到(我的意思是整個網站),如果我添加一個「或」的網址... http:// localhost/url /通常可以工作,但http:// localhost/url /'不起作用(網站無法找到)爲什麼? – John