0

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

myServer.com/data中有数百个文件夹,每个文件夹中有几个文件。这些是纯 html 文件。

myServer.com/code中是一个 php targetPage.php

我可以像这样构建一个 URL:

http://www.myServer.com/code/targetPage.php?folder=folder132&name=file23

读取源文件夹中的源文件并将源“div”的内容包含为目标页面中“targetDiv”的 innerHTML 的 php 是什么?

<body><div id="targetDiv">This is the place holde div</div>

我对php相当陌生,因此提出了这个问题。

4

3 回答 3

1

这基本上是对潜在黑客的邀请,他们无疑会感谢您让他们能够轻松地指定在您的 PHP 页面中包含(并因此执行)哪些文件。

乍一看,这至少与导致 SQL 注入攻击的问题有相似之处。您确定要从查询字符串中获取包含文件的路径吗?查询字符串向最终用户公开。我看到的一个问题是,这往往会将您网站的内部结构暴露给访问者。另一个问题是,作为访问者,我将能够尝试不同的包含文件,直到我大概找到一个以某种方式(最好)或(最坏)损害您的安全并为我提供更大访问权限的站点到您的服务器或数据库,然后让我深入研究您的系统,直到我完全破坏它,或者能够删除或更新您不希望我删除的数据库中的内容。通过“我”和“我”,

我会探索寻找一种不同的(服务器端,不暴露给访问者)方法来确定要包含的文件。

于 2013-04-17T06:34:36.637 回答
1

首先,绝对确保包含的文件是允许的,最好使用白名单

然后,您可以使用类似的函数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()

于 2013-04-17T06:37:04.383 回答
0

如果文件夹应该只是一个没有目录分隔符的名称,您可以使用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将是一个常量,包含从中加载文件的基本目录。

于 2013-04-17T07:06:47.723 回答