使用array_slice删除scandir点和点点条目是否安全?

时间:2014-08-17 12:17:10

标签: php scandir

我想在我的PHP脚本中使用array_slicescandir

正常使用:

<?php

$files = scandir('/path/to/files');

foreach($files as $file) {
    if($file != '.' && $file != '..') {
        // Do something here...
    }
}

我的例子:

<?php

$files = array_slice(scandir('/path/to/files'), 2);

foreach($files as $file) {
    // Do something here...
}

我的疑问是,使用这种逻辑是否安全?

2 个答案:

答案 0 :(得分:3)

绝对不安全。以下示例使用名为!的文件创建目录。当scandir对结果进行排序时,!.之前会显示..

mkdir('test');
touch('test/!');
print_r(scandir('test'));
unlink('test/!');
rmdir('test');

输出:

Array
(
    [0] => !
    [1] => .
    [2] => ..
)

通常,对于以.之前排序的字符开头的所有文件名,这都是一个问题。这包括一些可能在现实世界数据中不存在的不可打印字符,但它也适用于包括! # $ % & ( ) + -在内的常见标点符号。

即使它有效,我也不推荐它,因为使用array_slice会使代码的意图不那么明确。

答案 1 :(得分:1)

我强烈建议您使用SPL Directory Iterator来满足此类要求,而不是尝试按照老派的方式扫描目录。

试试这个:

$iterator = new \DirectoryIterator('/path/to/files');
foreach ($iterator as $file) {
    if($file->isDot()) {
        continue;
    }
    /** Now here you can use lot of SplFileInfo interface methods here */
    // $file->getFilename();
    // $file->isFile();
    // $file->isDir();
    // $file->getSize();
}