PHP从查询字符串中包含变量文件


php include variable file from query string

包含从查询字符串获得文件夹和文件名的文件的最佳方法是什么?

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将是一个常量,它包含加载文件的基目录