2013-07-17 82 views
0

我通過一個名爲index.php的文件重定向所有頁面請求,該文件查看訪問者請求的URL並查看是否存在要匹配的模板文件。PHP包含基於pathinfo的文件 - 安全性問題?

例如,http://www.website.com/contact實際上將路由到index.php腳本,並應檢查文件/var/html/template/contact.tpl是否存在幷包含它,如果是的話。

我關心的是關於安全和空字符,額外的點和斜線等是否有一種過濾器需要將下面的代碼或者是使用PATHINFO和目錄前綴就夠了嗎?顯然,我不希望任何人能夠惡意地將文件包含在指定的模板目錄之外。

<?php 

define ('TEMPLATES', '/var/html/templates'); 

$page = pathinfo ($_SERVER['REQUEST_URI'], PATHINFO_FILENAME); 

if (file_exists (TEMPLATES . '/' . $page . '.tpl')) { 
    include (TEMPLATES . '/' . $page . '.tpl'); 
} else { 
    header ('HTTP/1.0 404 Not Found'); 
    echo 'Sorry page not found'; 
} 

?> 

回答

3

是100%的安全,使允許訪問的網頁的清單,並檢查它的數組中返回頁面之前。

你甚至可以嘗試一個PHP​​3210如

define ('TEMPLATES', '/var/html/templates/'); 

$page = TEMPLATES . pathinfo($_SERVER['REQUEST_URI'], PATHINFO_FILENAME) . '.tpl'; 

if (in_array($page, glob(TEMPLATES . '*.tpl'))) { 
    include ($page); 
} else { 
    header ('HTTP/1.0 404 Not Found'); 
    echo 'Sorry page not found'; 
} 

這將驗證它的文件夾中,並且擴展名是「.tpl」

對不起 - 只是編輯,以使水珠()行爲正確。

+0

對每個請求都進行全局透明處理?這不是一個好的選擇。 – Gumbo

+0

你是對的 - 它不是超級快,但更多的是展現一個觀點。我的答案的第一句話將是我推薦的解決方案。如果在生產中使用glob,那麼'GLOB_NOSORT'標誌將是提高性能的好主意。 – calcinai

+0

感謝您的回答,在過去,我已經使用了一種網頁「白名單」中的建議,但最好我不想在每次創建一個新網頁/模板的時間來更新白名單 – MrCarrot