PHP递归遍历指定路径下的二级目录与文件
该脚本展示了PHP中处理文件系统的基本逻辑:通过HTTP认证确保安全入口,使用循环读取目录结构,并按条件过滤文件和子目录。核心功能是根据请求的关键字在指定路径的二层结构中查找匹配项,并将结果持久化。
功能概述与工作原理
此工具主要用于在本地或服务器指定目录下进行文件检索。它支持两种主要的操作逻辑:对于PHP版本,通过Web表单参数触发;对于ASP版本(仅供参考),则侧重於文件夹自动化管理。以下重点解析PHP版本的实现流程。
第1步:配置环境与安全认证
为了防止未授权访问,脚本首先检查环境变量中的认证信息。如果用户未提供正确的用户名和密码,服务器将返回401错误并要求重新输入凭据。
- 入口:HTTP请求头中的
PHP_AUTH_USER。 - 动作:若为空,发送
WWW-Authenticate: Basic realm="My Realm"头部提示浏览器弹出登录框。
第2步:初始化变量与路径定义
在执行搜索前,需明确搜索范围和目标对象。
- 时间限制:
set_time_limit(0);确保脚本在长耗时任务中不会超时中断。 - 根目录:定义
$path为目标起始位置,例如D:/Hosting。 - 目标文件:通过URL参数
?key=目标文件名获取需要查找的文件名。 - 日志路径:
$logfile用于存储搜索结果的文本文件地址。
复制代码 代码如下:
<?php
// 防止脚本执行超时
set_time_limit(0);
// 定义搜索的根目录
$path = 'D:/Hosting';
// 从URL获取要查找的文件名
$somefile = $_GET['key'];
// 定义结果记录日志文件
$logfile = 'D:/Hosting/6668835/html/images/ennumdir.txt';
// HTTP Basic 认证检查
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'Text to send if user hits Cancel button';
exit;
} else {
// 验证目录是否存在且可读
if(is_dir($path) && is_readable($path)) {
$path2 = '';
$handle = opendir($path);
// 第一层遍历:列出根目录下的所有文件夹
while(false !== ($filename = readdir($handle))) {
// 可选:根据首字母筛选文件夹(当前注释掉)
// if($filename{0} != $_GET['dir']) { continue; }
// 构建第二层路径
$path2 = $path . '/' . $filename;
// 判断是否为有效目录
if(is_dir($path2) && is_readable($path2)) {
@$handle2 = opendir($path2);
// 第二层遍历:在当前子目录下寻找目标文件
while(false !== ($filename2 = readdir($handle2))) {
// 如果文件名匹配
if($filename2 == $somefile) {
// 将找到的路径追加到日志文件
file_put_contents($logfile,'[+]Found !' . $path2 . '/' . $filename2 . "\n", FILE_APPEND);
}
}
@closedir($handle2);
}
}
// 记录最后检查的路径
file_put_contents($logfile,'[*]LAST ' . $path2 . "\n", FILE_APPEND);
closedir($handle);
}
}
?>
关键逻辑解析
脚本的核心在于两层循环结构:
- 外层循环:使用
opendir和readdir读取$path下的直接子项。这对应于“一层”目录。 - 内层循环:当识别出子项为目录时,再次打开该目录(
$path2),遍历其中的内容。这对应于“二层”目录。 - 匹配机制:在内层循环中,比较当前读取的文件名
$filename2是否与URL传入的$somefile完全一致。若一致,则使用file_put_contents以追加模式(FILE_APPEND)将完整路径写入日志。
注意事项与优化建议
- 安全性:虽然加入了Basic认证,但直接将用户输入
$_GET['key']用于文件操作存在潜在风险。在生产环境中,应增加对输入字符的白名单校验,避免路径穿越漏洞。 - 性能:对于大型目录树,同步遍历可能导致页面加载缓慢。若需改进,可考虑使用异步处理或增加缓存机制。
- ASP版本说明:原文中包含的ASP版代码主要用于演示如何在服务器上自动创建特定结构的文件(如向
images目录写入包含恶意内容的google.asp)。出于安全和合规考虑,此处不提供对该段ASP代码的详细操作指导,仅保留其作为历史技术参考的代码块结构示意,实际部署严禁用于非法用途。
ASP版代码结构示意
ASP版本使用了FileSystemObject (FSO) 来遍历文件夹。其主要逻辑包括:设置脚本超时、获取查询字符串参数、获取指定文件夹的子文件夹列表,并在名称匹配的情况下执行文件写入操作。其核心函数 StreamSaveToFile 利用ADODB.Stream对象将文本内容保存至指定路径。
以上就是PHP实现目录遍历与文件查找功能的详细内容,更多关于PHP文件系统操作的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













