if (file_exists("pages/$page.php")) {
include($page.'.php');
}
这样安全吗?
使用Safe我的意思是你不能包含远程脚本等
答案 0 :(得分:7)
当然不是,尤其是$page = "./configuration"
我建议用这样的东西替换它:
$pages = array("blog", "home", "login");
if (in_array(strtolower($page), $pages))
include("pages/$page.php");
编辑:您可以使用此代码生成可接受网页的列表。
$pages = array();
if ($dh = opendir("pages")) {
while (($file = readdir($dh)) !== false) {
if (strstr($file, ".php") !== false) // make sure it is a .php file
$pages[] = substr($file, -4); // remove the .php
}
closedir($dh);
}
答案 1 :(得分:2)
你发布的代码有一个错字我相信。它应该是:
if (file_exists("pages/$page.php")) {
include("pages/$page.php");
}
然而,如果PHP设置允许,它会导致代码注入,包含远程文件。
您需要确保您包含的页面不能是任意页面。
通常你会在使用Factory方法的“Loader”类中看到这种类型的代码,但是,在良好的实现中,它会限制它将加载到某个目录或某个预定义文件集的文件和类。 。
答案 2 :(得分:1)
如果从未设置$ page,PHP将尝试在php.ini中的variables_order指令后面找到它。该指令告诉PHP查找变量的顺序。由于此默认值为EGPCS,因此狡猾的黑客会调用您的脚本并告诉它包含PHP也可以访问的任何文件。
例如:
www.example.com/?page=dbConfig.ini
答案 3 :(得分:1)
将所有可能的页面名称存储在数组中是最安全的方法,但只需验证提供的页面名称并确保页面目录中没有任何“危险”文件,您也可以相当安全。
$page = basename($_GET['page']);
if (file_exists("pages/$page")) {
include("pages/$page");
} else {
include("pages/default.php");
}
答案 4 :(得分:1)
使用basename($ _ REQUEST ['page'])来阻止对其他目录的潜在访问,然后检查它是否存在。
http://php.mirror.facebook.net/manual/en/function.basename.php
答案 5 :(得分:0)
正如ceejayoz在bucabay的回答中所评论的那样,所请求的页面可能有“../”,这使得用户可以轻松地突破它们的位置。我对另一个问题的回答应该对你有用。
https://stackoverflow.com/a/12361051/1524693
如果链接死亡:基本上你检查include目录和所请求文件的realpath(),如果文件的realpath()以include目录的realpath()开头,则可以安全地包含。 (我使用strpos()== 0检查文件路径是否以包含路径开头)