Подтвердить что ты не робот

.rar,.zip файлы MIME-тип

Я разрабатываю простую загрузку php script, и пользователи могут загружать только файлы ZIP и RAR.

Какие типы MIME я должен использовать для проверки $_FILES[x][type]? (полный список пожалуйста)

Спасибо..

4b9b3361

Ответ 1

Ответ от свободы слова:

.rar    application/x-rar-compressed, application/octet-stream
.zip    application/zip, application/octet-stream

Я также проверил бы имя файла. Вот как вы можете проверить, является ли файл RAR или ZIP файлом. Я протестировал его, создав быстрое приложение командной строки.

<?php

if (isRarOrZip($argv[1])) {
    echo 'It is probably a RAR or ZIP file.';
} else {
    echo 'It is probably not a RAR or ZIP file.';
}

function isRarOrZip($file) {
    // get the first 7 bytes
    $bytes = file_get_contents($file, FALSE, NULL, 0, 7);
    $ext = strtolower(substr($file, - 4));

    // RAR magic number: Rar!\x1A\x07\x00
    // http://en.wikipedia.org/wiki/RAR
    if ($ext == '.rar' and bin2hex($bytes) == '526172211a0700') {
        return TRUE;
    }

    // ZIP magic number: none, though PK\003\004, PK\005\006 (empty archive), 
    // or PK\007\008 (spanned archive) are common.
    // http://en.wikipedia.org/wiki/ZIP_(file_format)
    if ($ext == '.zip' and substr($bytes, 0, 2) == 'PK') {
        return TRUE;
    }

    return FALSE;
}

Обратите внимание, что он по-прежнему не будет на 100% уверенным, но, вероятно, он достаточно хорош.

$ rar.exe l somefile.zip
somefile.zip is not RAR archive

Но даже WinRAR обнаруживает не RAR файлы как архивы SFX:

$ rar.exe l somefile.srr
SFX Volume somefile.srr

Ответ 2

Для загрузки:

Официальный список типов mime можно найти по адресу Администрирование номеров Интернета (IANA). В соответствии с их заголовком Content-Type для zip есть application/zip.

Тип носителя для файлов rar официально не зарегистрирован в IANA, но неофициальное широко используемое значение mime-типа application/x-rar-compressed.

application/octet-stream означает столько же, сколько: "Я отправляю вам поток файлов, а содержимое этого потока не указано" (так что это правда, что он может быть также файлом zip или rar). Предполагается, что сервер обнаруживает, что такое фактическое содержимое потока.

Примечание.. Для загрузки небезопасно полагаться на тип mime, заданный в заголовке Content-Type. Заголовок настроен на клиенте и может быть установлен на любое случайное значение. Вместо этого вы можете использовать информацию о файле php file для обнаружения файла mime-типа на сервере.


Для загрузки:

Если вы хотите загрузить файл zip, и ничего больше, вы должны установить только одно значение заголовка Accept. Любые дополнительные значения будут использоваться в качестве резерва в случае, если сервер не сможет удовлетворить ваш запрос в запрошенном типе типа Accept.

В соответствии с спецификациями WC3:

application/zip, application/octet-stream 

будет intrepreted как: "Я предпочитаю mime-тип application/zip, но если вы не можете доставить это, то application/octet-stream (поток файлов) также прекрасен".

Итак, только один:

application/zip

Гарантирует вам файл zip (или ответ 406 - Not Acceptable в случае, если сервер не сможет удовлетворить ваш запрос).

Ответ 3

Нельзя доверять $_FILES['upfile']['mime'], проверьте тип MIME самостоятельно. Для этой цели вы можете использовать fileinfo extension, включенный по умолчанию с PHP 5.3.0.

  $fileInfo = new finfo(FILEINFO_MIME_TYPE);
  $fileMime = $fileInfo->file($_FILES['upfile']['tmp_name']);
  $validMimes = array( 
    'zip' => 'application/zip',
    'rar' => 'application/x-rar',
  );

  $fileExt = array_search($fileMime, $validMimes, true);
  if($fileExt != 'zip' && $fileExt != 'rar')
    throw new RuntimeException('Invalid file format.');

ПРИМЕЧАНИЕ. Не забудьте включить расширение в php.ini и перезагрузить сервер:

extension=php_fileinfo.dll

Ответ 4

Как расширение может содержать более или менее трех символов, следующее будет проверяться на расширение независимо от его длины.

Попробуйте следующее:

$allowedExtensions = array( 'mkv', 'mp3', 'flac' );

$temp = explode(".", $_FILES[$file]["name"]);
$extension = strtolower(end($temp));

if( in_array( $extension, $allowedExtensions ) ) { ///

для проверки всех символов после последнего "."