包含从查询字符串中获取文件夹和文件名的文件的最佳方法是什么?
在 myServer.com/data 中,有数百个文件夹,每个文件夹中包含多个文件。 这些是普通的html文件。
myServer.com/code 是php targetPage.php
我可以建立这样的网址:
http://www.myServer.com/code/targetPage.php?folder=folder132&name=file23
在源文件夹中读取源文件的php是什么,并在目标页面中包含源“div”的内容作为“targetDiv”的innerHTML?
<body><div id="targetDiv">This is the place holde div</div>
我对php很新,因此问题。
答案 0 :(得分:1)
这基本上是对潜在黑客的邀请,毫无疑问,他们会感谢您让他们能够轻松指定要在PHP页面中包含哪些文件(并因此执行)。
乍一看,这至少与导致SQL注入攻击的那种问题有相似之处。您确定要从查询字符串中获取包含文件的路径吗?查询字符串向最终用户公开。我看到的一个问题是,这会使您的网站的内部结构暴露给访问者。另一个问题是,作为访问者,我可以尝试使用不同的包含文件,直到我发现一个以某种方式(充其量)或(最坏的情况下)破坏网站的方式会损害您的安全性并为我提供更大的访问权限到您的服务器或数据库,这将让我深入了解您的系统,直到我完全妥协,或者能够删除或更新您不希望我的数据库中的内容。通过“我”和“我”,当然我假设有人试图破解你的网站。
我会探索找到一个不同的(服务器端,不向访问者公开)方式来确定要包含哪个文件。
答案 1 :(得分:1)
首先,让完全确定允许包含的文件,最好是使用whitelist。
然后,您可以使用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()
检查规范生成的路径。
答案 2 :(得分: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
将是一个常量,包含从中加载文件的基本目录。