php目录阅读问题

时间:2012-07-17 19:10:50

标签: php directory traversal

我编写了这个简单的脚本,将目录中的所有文件显示为一组按钮。

此代码从上传目录中读取并显示表单中提交按钮内的所有文件。

$handle = opendir("upload");
echo '<form name="form" method="post" action="download.php">';
while($name = readdir($handle)) {
  echo '<input type="submit" name="file" value='.$name.' />';
}
echo '</form>';

现在这个问题是;每次我运行脚本时,我会在开头找到两个按钮...

我无法弄清楚导致此问题的原因。

3 个答案:

答案 0 :(得分:3)

您遇到的是文件系统使用的两个特殊文件。

  • .代表您当前所在的目录。 1

  • ..代表当前目录的父目录。 2

脚注:
1。诸如“/ my_dir /././././././ file”之类的路径相当于“/ my_dir /文件“
2. 诸如“/ my_dir /../ my_dir /../ my_dir / file”之类的路径相当于“/ my_dir / file “,因为..会让你”向上“移动一个级别。


要解决向用户展示这两个内容的问题,请使用以下内容过滤readdir返回的内容:

while  ($name = readdir ($handle)) {
  if ($name == '.' || $name == '..')
    continue; /* don't echo anything, skip to next read */

   echo '<input type="submit" name="file" value='.$name.' />';
}

答案 1 :(得分:0)

目录列表包括。对于当前目录和...为父目录。

我通常使用PHP手册中的内容(http://php.net/manual/en/function.readdir.php)

if ($handle = opendir('.')) {
    while (false !== ($entry = readdir($handle))) {
        if ($entry != "." && $entry != "..") {
            echo "$entry\n";
        }
    }
    closedir($handle);
}

所以你需要做的是排除。和..来自输出。

答案 2 :(得分:0)

另一种解决方案是使用像这样的FilesystemIterator:

foreach(new FilesystemIterator('upload') as $file){
    echo $file;
}

会自动跳过。和..文件系统中的条目。