起因是战队的朋友问我ciscn Dropbox那道题为什么download的任意文件下载在设置文件名为1.jpg时可以触发,改成phar:\/\/1.jpg就不能触发了。
然后我就看了下那个题的源码
关键代码在这里

  public function open($filename) {
        $this->filename = $filename;
        if (file_exists($filename) && !is_dir($filename)) {
            return true;
        } else {
            return false;
        }
    }

在download把文件返回之前 先用open判断了文件是否存在 并且不能是一个目录
注意这个is_dir($filename)是有一个非判断的 那么就只可能是is_dir判断phar:\/\/1.jpg是一个目录
自己试一下


果然是这样
转念一想其实这样也有道理的,毕竟在经过phar:\/\/解析的phar文件,其实是一个压缩包的形式
是允许phar:\/\/1.phar\/xxx.txt这种形式存在的 当成目录也无可厚非
至于is_dir具体的处理方式 可能就得通过阅读php的c语言内核代码来了解了
另外形如phar://phar.phar/1.txt的文件还是被判断为文件的,符合预期

Categories: 技术

0 Comments

发表评论

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用*标注