【问题标题】:Laravel validation of zip file contentLaravel 验证 zip 文件内容
【发布时间】:2018-05-16 07:47:03
【问题描述】:

我只想接受扩展名为“.zip”的文件。我添加了一个规则 mime-type application/zip 来控制它。但我不知道它的内容,所以我需要检查 zip 文件的内容以避免未知文件。如何安全地控制 zip 文件的内容?

我正在使用https://github.com/Chumper/Zipper 提取和 laravel 版本是 5.5

public function store(Request $request, User $sharingUser) {
        $rules = [
            'patient_case_id'   => 'required|exists:patient_cases,id',
            'file'              => 'required|mimes:zip,rar',
        ];  
}

上传的 zip 文件的内容树如下:

xxxx - 主文件夹

|- aaaa.adf

|- bbbb.adf

|- cccc.adf

|- dddd.adf

|- aaaa.ocx

文件夹只能有 .adf 和 .ocx 文件...但我不知道文件夹中有多少个文件。

注意:它是一个 RESTful API

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    我想你想知道一个 zip 文件夹的内容,而不是解压然后只接受它,对吗?

    您可以使用此代码了解 zip 文件夹的内容。

    <?php
    $za = new ZipArchive(); 
    
    $za->open('theZip.zip'); 
    
    for( $i = 0; $i < $za->numFiles; $i++ ){ 
        $stat = $za->statIndex( $i ); 
        print_r( basename( $stat['name'] ) . PHP_EOL ); 
    }
    ?>
    

    然后你可以检查你的条件。

    您可以在http://www.php.net/ziparchive找到更多相关信息

    【讨论】:

    • 我们如何知道 zip 中每个文件的 mime 类型?
    【解决方案2】:

    我建议您改用PHP League's ZipArchive Adapter。

    创建一个新的validation rule。在请求中设置规则,然后定义逻辑。

    use League\Flysystem\Filesystem;
    use League\Flysystem\ZipArchive\ZipArchiveAdapter;
    
    $filesystem = new Filesystem(new ZipArchiveAdapter(getrealpath($value)));
    

    在passes() 方法中,设置文件系统以读取文件。我想你可能需要弄清楚临时存储realpath($value)中文件的路径。

    然后充实检查的逻辑。您可以像这样遍历文件:

    foreach ($filesystem->listContents() as $object) {
        if (!in_array($object['mimetype'], ['mimetype1', 'mimetype2'])) {
            return false;
        }
    
    }
    return true;
    

    我不记得listContents() 是否递归地列出了所有文件,但可能有一个选项可以做到这一点,请查看他们的文档。您不必使用 mimetype 比较,只需使用最有意义的内容即可。

    【讨论】:

    • 简洁的方法!几件事:我需要使用realpath(),而不是getrealpath()。另外,['mimetype'] 不是一个选项,所以我使用了['extension']
    • 没有必要获取扩展名并进行验证,因为任何文件都可以将其更改为另一个扩展名。例如)一个 png 文件可以将其更改为 jpg 并且此代码将失败。我们必须找出那个文件的 mimetype。
    • @AlbertRaj 试试File::guessClientExtension()
    • @Jonathan 不确定我们如何在 ZipArchiveAdapter 中使用这个 File::guessClientExtension()。如果可能,添加文档或示例
    • @AlbertRaj 查看此方法的文档。如果它对你有一点帮助,请投票给答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多