Я разрабатываю простой сценарий загрузки php, и пользователи могут загружать только файлы ZIP и RAR.
Какие типы MIME я должен использовать для проверки $_FILES[x][type]
? (полный список пожалуйста)
Спасибо..
Ответ от свободы слова:
.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
Официальный список типов mime можно найти в авторитете Internet Assigned Numbers Authority (IANA) . Согласно их списку заголовок Content-Type
для zip
является application/zip
.
Тип носителя для файлов rar
официально не зарегистрирован в IANA, но неофициальное широко используемое значение mime-типа – application/x-rar-compressed
.
application/octet-stream
означает столько, сколько: «Я отправляю вам поток файлов, а содержимое этого потока не указано» (так что это правда, что это может быть файл zip
или rar
). Предполагается, что сервер обнаруживает, что такое фактическое содержимое потока.
Примечание. Для загрузки небезопасно полагаться на тип mime, заданный в заголовке Content-Type
. Заголовок настроен на клиенте и может быть установлен на любое случайное значение. Вместо этого вы можете использовать функции информации о файле php для обнаружения файла mime-типа на сервере.
Если вы хотите загрузить zip
файл, и ничто другое, вы должны установить только одно значение заголовка Accept
. Любые дополнительные значения будут использоваться в качестве резерва в случае, если сервер не сможет удовлетворить ваш запрос в запрошенном типе MIP-заголовка Accept
.
Согласно спецификациям WC3 это:
application/zip, application/octet-stream
будет воспринято как: «Я предпочитаю тип application/zip
mime, но если вы не можете доставить это, то application/octet-stream
(поток файлов) также прекрасен».
Так что только сингл:
application/zip
Гарантирует вам zip
файл (или 406 - Not Acceptable
ответ в случае, если сервер не сможет удовлетворить ваш запрос).
Вы не должны доверять $_FILES['upfile']['mime']
, проверьте тип MIME самостоятельно. С этой целью вы можете использовать расширение fileinfo
, включенное по умолчанию с 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
Поскольку расширение может содержать более или менее трех символов, следующее будет проверяться на расширение независимо от его длины.
Попробуй это:
$allowedExtensions = array( 'mkv', 'mp3', 'flac' ); $temp = explode(".", $_FILES[$file]["name"]); $extension = strtolower(end($temp)); if( in_array( $extension, $allowedExtensions ) ) { ///
для проверки всех символов после последнего '.'