动态包括

时间:2009-03-01 14:20:23

标签: php

<?php
// Default page
if (!$_SERVER['QUERY_STRING']) $Page = "news";

// View
elseif (isset($_GET['newsID'])) $Page = "newsView";
elseif (isset($_GET['userID'])) $Page = "profile";
elseif (isset($_GET['messageID'])) $Page = "message";
elseif (isset($_GET['threadID'])) $Page = "thread";
elseif (isset($_GET['forumID'])) $Page = "forum";
elseif (isset($_GET['imgID'])) $Page = "imageView";

// Pages
elseif ($_GET['content'] == "search") $Page = "search";
elseif ($_GET['content'] == "gallery") $Page = "gallery";
elseif ($_GET['content'] == "forums") $Page = "forums";
elseif ($_GET['content'] == "messages") $Page = "messages";
many more...

// If page don't exist
else $Page = "error";

// Output page
include($config['PAGE_PATH'].$Page.'.php');
include($config['TEMPLATE_PATH'].$Page.'.html');
?>

这是我朋友多年前写的一些代码......
我想知道这是多么安全,如果我能让它更干净一点?

感谢。

4 个答案:

答案 0 :(得分:2)

由于您定义了允许包含哪些页面(白名单),我无法看到任何方法来毒害$Page变量。所以这看起来很安全。

但您可以使用以下数组清理它:

$argToPage = array(
    'newsID'    => 'newsView',
    'userID'    => 'profile',
    'messageID' => 'message',
    'threadID'  => 'thread',
    'forumID'   => 'forum',
    'imgID'     => 'imageView'
);
$contents = array(
    'search',
    'gallery',
    'forums',
    'messages'
);

$Page = null;
if (trim($_SERVER['QUERY_STRING']) == '') {
    $Page = 'news';
} else {
    foreach ($_GET as $key => $val) {
        if (isset($argToPage[$key])) {
            $Page = $argToPage[$key];
            break;
        }
    }
}
if (is_null($Page) && isset($_GET['content']) && in_array($_GET['content'], $contents)) {
    $Page = $contents[$_GET['content']];
} else {
    $Page = 'error';
}

但那不太清洁。

答案 1 :(得分:1)

在代码清理参数的意义上,它是安全的。人们经常这样做(通常是灾难性的结果)。

然而,我不是这种模式的忠实粉丝。我指的是一个包含传递参数的文件的控制器。我更喜欢每页都有一个脚本,只需要包含所需内容。在结构上我觉得它更好。

话虽如此,上述方法没有任何根本性的错误。

请确保您对来自用户的任何数据进行极端偏执处理。

答案 2 :(得分:0)

我会非常谨慎地清理它。使用include中用户输入提供的变量是一个主要的安全漏洞。我会保留原样。

答案 3 :(得分:0)

你可以创建一个数组,其中GET选项作为键,页面作为值。然后使用switch()语句。这应该使代码更清洁。但正如Cletus所说,这不是制作控制器的最佳方式。