2012-07-06 51 views
-2

如何創建一個動態的PHP包含,這是安全的?比如我有header.php文件和footer.php包括它裏面的index.php文件,再抓其他頁面其間使用一個安全的動態PHP包括?

index.php?page=about 

如果可能的話,將需要動態的,所以使用數組和案例會耗時且需要修改。

我也希望能夠更改網站的標題以及取決於包含的頁面。

目前,我有這個到位:

<?php 
require_once 'includes/config.php'; 
//Set values for page 
$page_title = 'home page'; 
$current_page = 'home'; 

require_once 'includes/header.php'; 
?> 


CONTENT 


<?php 
require_once 'includes/footer.php'; 
?> 

感謝

這將是一個安全的方式,包括我的網頁?

if(isset($_GET[ 'page' ])) 
{ 
    if(strpos($_GET[ 'page' ], "/")) 
    { 
     $dir = substr(str_replace(’’, 」, $_GET[ 'page' ]), 0, strpos($_GET[ 'page' ], "/")) . "/"; 

     $file = substr(strrchr($_GET['page' ], "/"), 1); 
     if(file_exists($dir.$file.".php")) 
     { 
     include($dir.$file.".php"); 
     } else { 
     include("home.php"); 
     } 
    } else { 
     if(file_exists(basename($_GET[ 'page' ]).".php")) 
     { 
     include(basename($_GET[ 'page' ]).".php"); 
     } else { 
     include("404.php"); 
     } 
    } 
} else { 
    include("home.php"); 
} 
+0

http://stackoverflow.com/questions/11354484/how-to-include-page-with-get-function-htaccess-linking/11354526#11354526 – Austin 2012-07-06 14:25:37

+0

如果你指的是romo的答案,那麼這沒有回答我的問題。這有點與我的問題的第二部分有關。然而,我不能控制標題會說什麼用除了文件名稱的方法。 – Sygon 2012-07-06 14:47:33

+0

是的,只需在開關內設置$ page_title變量即可。我指的是我在上面的鏈接中發佈的答案 – Austin 2012-07-06 14:51:25

回答

4

爲了防止你的Web目錄,或者你應該做以下無效頁面之外的錯誤和未經授權的文件訪問(安全)到頁。

通過檢查期間來驗證$ _GET ['page']。雖然句點在文件名中可能有效,但它看起來像是從該值構造文件名,並且句點可能表示突破嘗試訪問根目錄。

從那裏我將爲include創建文件路徑,然後在包含它之前使用file_exists確保它存在。

至於標題爲換頁包括我會做這樣的事情:

<?php 
$page_title = 'Default Title'; 
$page_to_include = 'default'; 

if(strpos($_GET['page'], '.') !== false){ 
    //throw/display error - could be a breakout attempt 
} 
if(!file_exists(sprintf('page_includes/%s.php', $_GET['page']))){ 
    //requested page does not exists, throw or display error 
}else{ 
    $page_to_include = sprintf('page_includes/%s.php', $_GET['page']); 
} 

//do page validation here with file_exists 
ob_start(); 
include $page_to_include; 
$included_page = ob_get_clean(); //gets contents and cleans the buffer and closes it 

require_once 'includes/header.php'; 
echo $included_page; 
require_once 'includes/footer.php'; 
?> 

這樣的網頁包括第一和存儲在緩衝區中,而該輸出。它允許您包含的頁面修改$ page_title,然後修改後的$ page_title可用於header.php腳本以在標記中輸出。

+0

的安全版本,謝謝你這讓我能夠改變頁面標題動態:)。將一個安全的方式包含在index.php中的文件是這樣的嗎? (我已經將代碼添加到了我原來的問題文章中) – Sygon 2012-07-06 15:20:48

+0

是的,那肯定可以工作,但是我也會在目錄檢查中使用basename,因爲您沒有在那裏檢查突破嘗試(../ .. /)。另外,如果我正確地閱讀它看起來你會失去任何嵌套的目錄(dir1/dir2/dir3 /文件成爲dir1 /文件)。 – Chris 2012-07-06 15:32:55

0

只是要改變標題?添加到您的header.php

<title> 
<?php 
if(isset($_GET['page']) { 
    echo $_GET['page']; 
} else { 
    echo 'My Site'; 
} 
?> 
</title> 
+0

我解釋得不好。我的意思是,如果我有文件about.php被包含在index.php裏面有一個變量,例如: '$ page_title ='關於本網站';' – Sygon 2012-07-06 14:31:14

+0

使用[isset function](http ://php.net/manual/en/function.isset.php),echo isset($ page_title)? $ page_title:'untitled';' – Stano 2012-07-06 14:49:51

+0

您可能需要創建一個單獨的'title.php'文件,因爲您無法在頁眉之前包含您的頁面並期望它能夠正常工作。那麼你只需要創建一次'case/switch'語句。你也可以使用JavaScript。 – romo 2012-07-06 14:50:48