简单的PHP控制器,这段代码有任何问题


Simple PHP Controller, any issues with this code?

我试图为一个小网站建立一个非常简单的php控制器页面。这是我目前所知道的。看起来效果不错。这样做有什么问题我可能会错过吗?

$page = $_GET['p'];
switch ($page)
{
case "":
    ob_start();
    include "inc/home.php";
    $content = ob_get_contents();
    ob_end_clean();
    break;
case $page:
    $page = str_replace("/", "", $page);
    if (file_exists("inc/".$page.".php"))
    {
       ob_start();
       include "inc/".$page.".php";
       $content = ob_get_contents();
       ob_end_clean();
    }
    else
       include "inc/404.php";
    break;
}
include("inc/header.php");
echo $content;
include("inc/footer.php");

更新:这是基于注释的最终代码,运行良好。

<?php
$page = (isset( $_GET['p']) && !empty($_GET['p'])) ? $_GET['p'] : 'home';
if( preg_match( '/[^a-z]/i', $page))
{
    $page = '404';
}
if( !file_exists( "inc/".$page.".php"))
{
    $page = '404';
}
ob_start();
include("inc/header.php");
include("inc/".$page.".php");
include("inc/footer.php");
?>

您的整个脚本可以重写如下:

$page = ( isset( $_GET['p']) && !empty( $_GET['p'])) ? $_GET['p'] : 'home';
// Only allow alphabetic characters in a user supplied page
if( preg_match( '/[^a-z]/i', $page))
{
    $page = '404';
}
if( !file_exists( "inc/".$page.".php"))
{
    $page = '404';
}
include("inc/header.php");
include("inc/".$page.".php");
include("inc/footer.php");

然而,这也不再受本地文件包含的影响,因为$page仅限于字母字符,如果提交了其他任何内容,脚本将显示404页面。

它也更高效,因为它不使用输出缓冲