PHP脚本自动创建文件结构表示

时间:2010-12-13 07:32:00

标签: php directory traversal

  

可能重复:
  PHP - Iterate through folders and display HTML contents

使用PHP,我正在尝试创建一个脚本,该脚本将导航到网站的根目录,并从那里使用scandir()glob()(那些是唯一的目录扫描功能我我已经学会了,我会使用递归方法浏览根目录中的所有项目,然后在遇到通过is_dir($fileName)测试成为目录的条目时重新调用自身。

这是我遇到问题的地方 - 当我到达一个目录条目时,它正确地将if语句正确导航到目录的命令,但是在调用自身时,我似乎无法获得glob()目录权限,因为每次调用它时,页面都会停止加载任何内容。我试图弄清楚,从扫描目录的相对基于URL的性质我将如何引用它。我设置了一个变量$ROOT_DIR,它是相对于php页面所在目录的根目录(在本例中为$ROOT_DIR="../../"),然后我会从逻辑上思考,我会用$ ROOT_DIR调用scanAllFiles [我的站点地图方法]。 $ fileName,在从字符串中删除前导"../../"之后,这是找到的目录的字符串。尝试之后,它不起作用。

我应该使用不同的目录遍历方法来执行此操作,还是我不正确地格式化方法调用?

1 个答案:

答案 0 :(得分:2)

大多数人只是使用MySQL制作站点地图,手动执行。

公开文件不安全,但您可以添加某些安全性。

<?php
    function files($dir=".") {
        $blacklist = array(str_replace("/","",$_SERVER['SCRIPT_NAME']), 'admin.php', 'users.txt', 'secret.txt');
        $return = array();
        $glob1 = glob($dir."/*");
        for($i=0;$i<=count($glob1)-1;$i++) {
            $item = $glob1[$i];
            $nodir = str_replace($dir, "", $item);
            if(is_dir($item)) {
                $file1 = explode('/', $item);
                $file = $file1[count($file1)-1];
                $merge = array_merge($return, files($item));
                if(!in_array($file, $blacklist) and !empty($nodir)) $return = $merge;
            }
            else {
                $file1 = explode('/', $item);
                $file = $file1[count($file1)-1];
                if(!in_array($file, $blacklist) and !empty($nodir)) $return[] = str_replace("./","",$item);
            }
        }
        return $return;
    }
    // Use like this:
    $files = files(); // Get all files from top folder down, no traling slash  ...
    for($i=0;$i<=count($files)-1;$i++) { // ... Go through them ...
        echo "<li>$files[$i]</li>"; // ... And echo the item
    }
?>