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

时间:2011-12-03 20:11:26

标签: php controller

我正在尝试为一个小网站构建一个非常简单的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");

?>

1 个答案:

答案 0 :(得分:2)

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

$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");

但是,这也不再受Local File Inclusion的影响,因为$page仅限于字母字符,如果提交了其他任何内容,脚本将显示404页面。

它不使用输出缓冲也更有效。