Проверка магических байтов или Mime-типов в PHP?

Итак, в настоящее время я использовал несколько разных методов для проверки типа пантомимы. Пользователь загружает файл с помощью формы, я беру тип mime, если это application / zip, я разрешаю, если что-то еще, я это отрицаю. Проблема в том, что что-то (как я предполагаю, браузеры) меняет тип mime на «application / octet-stream».

Мне интересно, как еще я могу проверить файл .zip при загрузке формы.

Код:

  $name = strtolower(end(explode('.', $filename))); 
    $accepted_types = array('application/zip', 'application/x-zip-compressed',   'multipart/x-zip', 'application/x-compressed'); 

  foreach($accepted_types as $good_type) { 
        if($good_type == $type) {   
            $okay = true;  
            break;
        } else {
            $okay = false;
        }
  }

person user2376223    schedule 01.08.2013    source источник
comment
возможный дубликат Как найти mime-тип файла с php?   -  person BlitZ    schedule 01.08.2013
comment
в сообщении формы не должно быть ничего, изменяющего тип содержимого файла на поток октетов приложения. не могли бы вы показать, как вы справляетесь с загрузкой, пожалуйста   -  person DevZer0    schedule 01.08.2013
comment
также вы можете сделать in_array($type, $accepted_types);, вам не нужен цикл.   -  person DevZer0    schedule 01.08.2013
comment
Это не ответ на вопрос, только одна подсказка: вы можете использовать этот код $name=strtolower(pathinfo($filename,PATHINFO_EXTENSION)); для получения файла расширения вместо $name = strtolower(end(explode('.', $filename)));   -  person ops    schedule 01.08.2013


Ответы (2)


Используйте mime-content-type.

$type = mime_content_type($filename);
person chris-l    schedule 01.08.2013

FWIW, вы можете получить магические байты, используя bin2hex. Согласно Википедии (https://en.m.wikipedia.org/wiki/Magic_number_(programming)#Magic_numbers_in_files), zip-файлы содержат первые 2 шестнадцатеричных байта 50 4B

$zip=file_get_contents("somefile.zip");

echo strtoupper (substr(bin2hex($zip),0,2)); //504B

person chiliNUT    schedule 24.05.2016
comment
Чтение всего zip-файла в память просто для проверки магических байтов - расточительство. Кроме того, 4 символа, а не 2. $F=fopen("somefile.zip","r"); $magic=fread($F,2); fclose($F); echo strtoupper(substr(bin2hex($magic),0,4)); //504B - person Sinus the Tentacular; 12.07.2019