Я разрабатываю простой скрипт загрузки php, и пользователи могут загружать только файлы ZIP и RAR.
Какие типы MIME следует использовать для проверки $_FILES[x][type]
? (полный список пожалуйста)
Спасибо..
Я разрабатываю простой скрипт загрузки php, и пользователи могут загружать только файлы ZIP и RAR.
Какие типы MIME следует использовать для проверки $_FILES[x][type]
? (полный список пожалуйста)
Спасибо..
Ответы Freedompeace, Kiyarash и Sam Vloeberghs:
.rar application/x-rar-compressed, application/octet-stream
.zip application/zip, application/octet-stream, application/x-zip-compressed, multipart/x-zip
Я бы тоже проверил имя файла. Вот как вы можете проверить, является ли файл файлом 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
application/x-zip-compressed
- person Kiyarash; 06.10.2014
zip
или rar
. Согласно спецификациям WC3, это будет интерпретироваться как: Я предпочитаю тип контента application/zip
|application/x-rar-compressed
, но если вы не можете доставить его, подойдет и application/octet-stream
(файловый поток).
- person Wilt; 09.04.2015
multipart/x-zip
может быть действительным? Он не многокомпонентный. Список SitePoint содержит много неточных типов MIME и далеко не полный. Официальный реестр IANA Media Types не является ( и, скорее всего, никогда не будет) завершен на 100%.
- person Suncat2000; 04.06.2019
Официальный список типов пантомимы можно найти по адресу Управлению по присвоению номеров в Интернете (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
. Любой дополнительный набор значений будет использоваться в качестве запасного варианта на случай, если сервер не сможет удовлетворить ваш тип mime, запрошенный в заголовке 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
Я вижу много отчетов об ответах для zip и rar для типов носителей application/zip
и application/x-rar-compressed
соответственно.
В то время как первое совпадение является правильным, для последнего IANA сообщает здесь https://www.iana.org/assignments/media-types/application/vnd.rar что для rar application/x-rar-compressed
является устаревшим псевдонимом, а вместо него application/vnd.rar
является официальным. Итак, правильные типы медиа от IANA в 2020 году:
zip
: application/zip
rar
: application/vnd.rar
В связанном вопросе есть некоторый код Objective-C для получения mime-тип для URL-адреса файла. Я создал расширение Swift на основе этого кода Objective-C, чтобы получить тип mime:
import Foundation
import MobileCoreServices
extension URL {
var mimeType: String? {
guard self.pathExtension.count != 0 else {
return nil
}
let pathExtension = self.pathExtension as CFString
if let preferredIdentifier = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension, nil) {
guard let mimeType = UTTypeCopyPreferredTagWithClass(preferredIdentifier.takeRetainedValue(), kUTTagClassMIMEType) else {
return nil
}
return mimeType.takeRetainedValue() as String
}
return nil
}
}
Поскольку расширение может содержать более или менее трех символов, следующее будет проверять наличие расширения независимо от его длины.
Попробуй это:
$allowedExtensions = array( 'mkv', 'mp3', 'flac' );
$temp = explode(".", $_FILES[$file]["name"]);
$extension = strtolower(end($temp));
if( in_array( $extension, $allowedExtensions ) ) { ///
для проверки всех символов после последнего '.'