laravel excel,是否有比彻底的mime类型检查更好的方法来验证上传的文件实际上是电子表格?

问题描述 投票:0回答:1

我有一个工具,允许用户上传电子表格,然后使用Laravel-Excel解析电子表格。我的问题是,如何在尝试解析文件之前检查该文件是否为有效的excel文件?

我查看了PHPOffice / Laravel-Excel文档,但找不到用于验证文件的方法。因此,我的下一个猜测是,如果我尝试Load()一个无效的文件,它将轰炸并给我警告或错误。但是,它不会解析该文件,而是尝试以某种方式将其转换为电子表格。例如,我给它提供了一个pdf文件,它确实生成了一个集合,其中包含它可以在pdf文件中找到的任何非二进制垃圾。这是不可取的。

[目前,我正在执行mime类型检查以验证文件。

//valid mime types

$mimeTypes = [
    'application/csv', 'application/excel',
    'application/vnd.ms-excel', 'application/vnd.msexcel',
    'text/csv', 'text/anytext', 'text/plain', 'text/x-c', 
    'text/comma-separated-values',
    'inode/x-empty',
    'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
             ];
$file = request()->hasFile('file');
if ($file) {
    if (in_array(request()->file('file')->getClientMimeType(), $mimeTypes)) {
        //then parse the file
        Config::set('excel.import.heading', 'original');
        $data = Excel::load(request()->file('file')->path(), function ($reader) {
        })->get();
         //do some stuff with data...
    } else {
        //invalid file
    }
} else {
    //no file uploaded
}

这是不理想的,因为似乎存在各种可能的mime类型,所以我将不得不主动维护列表,并且某些csv文件具有明文mime类型,因此非csv-plaintext文件将通过聚集在这里。 Laravel,Laravel-Excel或PHPOffice是否提供任何标准方法来验证文件?

php laravel laravel-5.2 laravel-excel phpoffice
1个回答
0
投票
之前,如何检查该文件是有效的excel文件?

这不是对文件的MIME检查!

您仅在此处检查用户提供文件扩展名信息。

string |nullgetClientMimeType()

返回文件的MIME类型。

客户端mime类型是从上传文件的请求中提取的,因此不应将其视为安全值

对于受信任的mime类型,请改用getMimeType()(它会根据文件内容猜测mime类型)。

Symfony Component HttpFoundation File UploadedFile

如果您要验证上传文件本身中的魔术MIME字节,可以通过依赖操作系统的PHP魔术MIME字节文件来实现,就像在PHP中这样。

$finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension
// $mime will contain the correct mime type
$mime = finfo_file($finfo, $_FILES['your-form-upload-input-name-here']['tmp_name'];
finfo_close($finfo);

请参见finfo_file以获取更多详细信息。

要特别使用您当前依赖的Symfony组件来执行此操作,请改为调用finfo_file方法。请注意,不同之处在于getMimeType()使用的是客户端提供的不可信任的信息,而getMimeType()所做的与上面getClientMimeType()演示的相同。

© www.soinside.com 2019 - 2024. All rights reserved.