包含从查询字符串获得文件夹和文件名的文件的最佳方法是什么?
在myServer.com/data中有数百个文件夹,每个文件夹中有几个文件。这些都是纯html文件。
myServer.com/code是一个phptargetPage.php
我可以建立一个这样的URL:
http://www.myServer.com/code/targetPage.php?folder=folder132&name=file23
什么是php读取源文件夹内的源文件,并包括源"div"的内容作为innerHTML的"targetDiv"在目标页面?
<body><div id="targetDiv">This is the place holde div</div>
我对php比较陌生,所以有这个问题
首先,使绝对确定所包含的文件是允许的,最好使用白名单。
然后,您可以使用file_get_contents()
这样的函数将文件读入字符串并使用echo
输出。
结束(这是一种方法,还有其他方法):
$file = $_GET['folder']."/".$_GET['file'];
if (in_array($file, $whitelist)) {
$contents = file_get_contents($file);
} else {
$contents = "Not allowed";
}
echo "<body><div id='targetDiv'>$contents</div>"
例如,您可以通过扫描希望能够显示的目录来生成白名单。(这超出了这个答案的范围;-))。
另一个解决方案是使用realpath()
检查规范化结果路径。
这基本上是在邀请潜在的黑客,毫无疑问,他们会感谢您让他们能够轻松地指定在PHP页面中包含哪些文件(并因此执行)。
乍一看,这至少与导致SQL注入攻击的问题有一些相似之处。您真的确定要从查询字符串获取包含文件的路径吗?将查询字符串公开给最终用户。我看到的一个问题是,这将倾向于向访问者暴露您网站的内部结构。另一个问题是,我,作为一个游客,可以尝试不同的包含文件,直到我可能找到一个网站打破了以某种方式(最好)或(在最坏的情况)妥协你的安全,给了我更大的访问你的服务器或数据库,这将让我更深入地系统,直到我完全妥协,还是能够删除或更新数据库中的事情,你不想让我去。这里的"我"answers"我"当然是指有人试图入侵你的网站。
我将探索寻找一种不同的(服务器端,不暴露给访问者)方法来确定包含哪个文件。
如果文件夹应该只是一个没有目录分隔符的名称,您可以使用basename()
从文件夹和名称中去掉分隔符。该文件夹需要特殊处理,因为..
在技术上是有效的,但您不希望允许到您的基本目录之外。
if (isset($_GET['folder'], $_GET['name'])) {
$folder = trim(basename($_GET['folder']), '.') ?: '.';
$name = basename($_GET['name']);
$file = BASE_DIR . "/$folder/$name";
if (is_file($file) && is_readable($file)) {
echo file_get_contents($file);
}
}
BASE_DIR
将是一个常量,它包含加载文件的基目录