Php 动态包含

Php 动态包含,php,Php,从代码清理参数的意义上讲,这是安全的。人们经常这样做(通常会造成灾难性的后果) 然而,我不是这个模式的超级粉丝。我指的是一个控制器,它包含传递给参数的文件。我更喜欢每页都有一个脚本,只包含需要的内容。从结构上来说,我认为更好 尽管如此,上述方法从根本上说没有什么错 只要确保你用极端偏执的态度对待来自用户的任何数据。我会更加谨慎地清理这些数据。在include中使用用户输入提供的变量是一个主要的安全缺陷。我会保持原样。您可以创建一个数组,其中GET选项作为键,pages作为值。。然后使用switc

从代码清理参数的意义上讲,这是安全的。人们经常这样做(通常会造成灾难性的后果)

然而,我不是这个模式的超级粉丝。我指的是一个控制器,它包含传递给参数的文件。我更喜欢每页都有一个脚本,只包含需要的内容。从结构上来说,我认为更好

尽管如此,上述方法从根本上说没有什么错


只要确保你用极端偏执的态度对待来自用户的任何数据。

我会更加谨慎地清理这些数据。在
include
中使用用户输入提供的变量是一个主要的安全缺陷。我会保持原样。

您可以创建一个数组,其中GET选项作为键,pages作为值。。然后使用switch()语句。这将使代码更干净。但正如克莱特斯所说,这并不是制作控制器的最佳方法。

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

但您可以使用以下阵列来清理它:

<?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');
?>
但这并不是很干净。

请记住(我第一次错过了),第一次检查是针对$\u服务器的,而不是$\u GET。我打算建议使用数组和isset()检查,直到我注意到这一点。
$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';
}