<?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');
?>
这是我朋友多年前写的一些代码......
我想知道这是多么安全,如果我能让它更干净一点?
感谢。
答案 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所说,这不是制作控制器的最佳方式。