PHP递归遍历指定路径下的二级目录与文件

拾光
拾光
发布时间:2026-10-15| 6人浏览过
原创

该脚本展示了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);
    }
}
?>

关键逻辑解析

脚本的核心在于两层循环结构:

  1. 外层循环:使用 opendir 和 readdir 读取 $path 下的直接子项。这对应于“一层”目录。
  2. 内层循环:当识别出子项为目录时,再次打开该目录($path2),遍历其中的内容。这对应于“二层”目录。
  3. 匹配机制:在内层循环中,比较当前读取的文件名 $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文件系统操作的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。