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

Уже исправленные репорты или принятые предложения
Ответить
shkarbatov
Сообщения: 423
Зарегистрирован: 2012.12.10, 14:19
Откуда: Россия

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

Сообщение 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.

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

Что скажите?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

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

Сообщение samdark »

А разве так нельзя?
Аватара пользователя
zabachok
Сообщения: 522
Зарегистрирован: 2013.12.16, 14:38

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

Сообщение zabachok »

Мне docx отдавал mime-type такой: application/vnd.openxmlformats-officedocument.wordprocessingml.document
xlsx примерно похожий
2b||!2b Just read the instructions
shkarbatov
Сообщения: 423
Зарегистрирован: 2012.12.10, 14:19
Откуда: Россия

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

Сообщение shkarbatov »

Sam Dark писал(а):А разве так нельзя?
На сколько мне известно - нет, хотя может я что-то не понимаю. Но во всяком случае при таких правилах, модель не проходит проверку.
zabachok писал(а):Мне docx отдавал mime-type такой: application/vnd.openxmlformats-officedocument.wordprocessingml.document
xlsx примерно похожий
Для xlsx точно отдается application/zip
shkarbatov
Сообщения: 423
Зарегистрирован: 2012.12.10, 14:19
Откуда: Россия

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

Сообщение shkarbatov »

shkarbatov писал(а): Понятно, что можно в правила добавить "checkExtensionByMimeType"=>false, но как по мне, то это дыра в безопасности.
На сколько я понимаю этот флаг, если он стоит в false, то проверка будет делаться исключительно по расширению, то есть без проверки MIME Type.
shkarbatov
Сообщения: 423
Зарегистрирован: 2012.12.10, 14:19
Откуда: Россия

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

Сообщение shkarbatov »

Скажем так: проверка на MIME Type обязательна.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

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

Сообщение samdark »

Не. Она будет проводиться. Просто при true он mime type для проверки берёт из расширения, а при false сам указываешь.
shkarbatov
Сообщения: 423
Зарегистрирован: 2012.12.10, 14:19
Откуда: Россия

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

Сообщение 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
            ],
        ];
    }
louisvuitton
Сообщения: 203
Зарегистрирован: 2014.02.16, 03:09

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

Сообщение louisvuitton »

Такой еще mime tipe пригодился (для exel 2007)

application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Ответить