Страница 1 из 1

Не корректное определение MIME Type

Добавлено: 2015.03.25, 11:16
shkarbatov
Всем привет, столкнулся с не очень приятным моментом.

Загружаю файл и проверяю его посредством FileValidator.
Вот такие вот правила у меня описаны в модели:

Код: Выделить всё

    public function rules()
    {
        return [
            [['file'], 'file', 'extensions'=> 'xls, xlsx, csv, sxc, dbf'],
        ];
    }
При загрузке файла с расширением *.xlsx мне выдало MIME Type application/zip.

Проблема в том, что у файлов этого типа нет своего MIME Type, и он юзает MIME Type: application/zip, таков ответ фунции finfo_file(), соответственно файл проверку не проходит.

Понятно, что можно в правила добавить "checkExtensionByMimeType"=>false, но как по мне, то это дыра в безопасности.

--------------------------------------------------------------------

Нашел на php.net предлагаемое решение этой проблемы:

Код: Выделить всё

$arrayZips = array("application/zip", "application/x-zip", "application/x-zip-compressed");

$arrayExtensions = array(".pptx", ".docx", ".dotx", ".xlsx");

$file = 'path/to/file.xlsx';

$original_extension = (false === $pos = strrpos($file, '.')) ? '' : substr($file, $pos);

$finfo = new finfo(FILEINFO_MIME);

$type = $finfo->file($file);

if (in_array($type, $arrayZips) && in_array($original_extension, $arrayExtensions))
{
   return $original_extension;
}
http://php.net/manual/ru/function.finfo-file.php#107750

--------------------------------------------------------------------

Что бы было более гибче, можно доработать правила, типа такого:

Код: Выделить всё

    public function rules()
    {
        return [
            [['file'], 'file', 'extensions'=> 'xlsx', 'mimeTypes'=> 'application/zip'],
            [['file'], 'file', 'extensions'=> 'xls, csv, sxc, dbf'],
        ];
    }
 
Если в правиле указан mimeTypes, то помимо стандартной проверки, если она не проходит, проверить на указанный в правиле mimeTypes.

--------------------------------------------------------------------

Что скажите?

Re: Не корректное определение MIME Type

Добавлено: 2015.03.25, 12:35
samdark
А разве так нельзя?

Re: Не корректное определение MIME Type

Добавлено: 2015.03.25, 12:43
zabachok
Мне docx отдавал mime-type такой: application/vnd.openxmlformats-officedocument.wordprocessingml.document
xlsx примерно похожий

Re: Не корректное определение MIME Type

Добавлено: 2015.03.25, 13:02
shkarbatov
Sam Dark писал(а):А разве так нельзя?
На сколько мне известно - нет, хотя может я что-то не понимаю. Но во всяком случае при таких правилах, модель не проходит проверку.
zabachok писал(а):Мне docx отдавал mime-type такой: application/vnd.openxmlformats-officedocument.wordprocessingml.document
xlsx примерно похожий
Для xlsx точно отдается application/zip

Re: Не корректное определение MIME Type

Добавлено: 2015.03.25, 13:23
samdark

Re: Не корректное определение MIME Type

Добавлено: 2015.03.25, 13:32
shkarbatov
shkarbatov писал(а): Понятно, что можно в правила добавить "checkExtensionByMimeType"=>false, но как по мне, то это дыра в безопасности.
На сколько я понимаю этот флаг, если он стоит в false, то проверка будет делаться исключительно по расширению, то есть без проверки MIME Type.

Re: Не корректное определение MIME Type

Добавлено: 2015.03.25, 13:33
shkarbatov
Скажем так: проверка на MIME Type обязательна.

Re: Не корректное определение MIME Type

Добавлено: 2015.03.25, 15:31
samdark
Не. Она будет проводиться. Просто при true он mime type для проверки берёт из расширения, а при false сам указываешь.

Re: Не корректное определение MIME Type

Добавлено: 2015.03.25, 17:16
shkarbatov
Точно, спасибо, просто флаг checkExtensionByMimeType немного сбивает с толку, как бы говоря не использовать проверку mimeType.

И если вот так писать, то по идее второе перетрет первое?

Код: Выделить всё

    
    public function rules()
    {
        return [
            [['file'], 'file', 'extensions'=> 'xlsx', 'mimeTypes'=> 'application/zip'],
            [['file'], 'file', 'extensions'=> 'xls, csv, sxc, dbf'],
        ];
    }
В итоге остановился на таком варианте:

Код: Выделить всё

    public function rules()
    {
        return [
            [
                'file',
                'file',
                'extensions' => 'xlsx, xls, csv, dbf',
                'mimeTypes' => 'application/zip, text/plain, application/x-dbf, application/vnd.ms-excel',
                'checkExtensionByMimeType' => false
            ],
        ];
    }

Re: Не корректное определение MIME Type

Добавлено: 2019.06.13, 19:39
louisvuitton
Такой еще mime tipe пригодился (для exel 2007)

application/vnd.openxmlformats-officedocument.spreadsheetml.sheet