Php 使用array_slice删除扫描点和点-点条目是否安全?

Php 使用array_slice删除扫描点和点-点条目是否安全?,php,scandir,Php,Scandir,我想在PHP脚本中使用array\u slice和scandir 正常用法: <?php $files = scandir('/path/to/files'); foreach($files as $file) { if($file != '.' && $file != '..') { // Do something here... } } <?php $files = array_slice(scandir('/path/to

我想在PHP脚本中使用
array\u slice
scandir

正常用法:

<?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...
}

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

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

Array
(
    [0] => !
    [1] => .
    [2] => ..
)
一般来说,这对于所有以字符开头的文件名都是一个问题,该字符排序在
之前。这包括一些在现实数据中可能不存在的不可打印字符,但它也适用于常见标点符号,包括
!#$%&()+-


即使它能工作,我也不推荐它,因为在那里使用array_slice会使代码的意图变得不那么清晰。

我强烈建议使用的是,而不是用老式的方式扫描目录

试试这个:

$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();
}

我同意w/@Boann:出于多种原因,聪明往往是有问题的。也就是说:“有能力的程序员完全意识到自己的头骨大小有限。因此,他以完全谦逊的态度完成任务,避免像瘟疫这样的聪明把戏。”-Edsger W.Dijkstreat强烈建议不要这样做。只需取消设置前2个元素。或者使用glob()。