Я разрабатываю простой скрипт загрузки php, и пользователи могут загружать только файлы ZIP и RAR.
Какие типы MIME я должен использовать для проверки $_FILES[x][type]
? (полный список, пожалуйста)
Спасибо..
Я разрабатываю простой скрипт загрузки php, и пользователи могут загружать только файлы ZIP и RAR.
Какие типы MIME я должен использовать для проверки $_FILES[x][type]
? (полный список, пожалуйста)
Спасибо..
Ответы:
Ответы от Liberceace, Кияраша и Сэма Флёберга:
.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
zip
или rar
файл вообще. В соответствии со спецификациями WC3 это будет интерпретироваться как: «Я предпочитаю application/zip
| application/x-rar-compressed
тип контента, но если вы не можете доставить это, application/octet-stream
(файловый поток) тоже подойдет».
multipart/x-zip
быть возможно? Это не из нескольких частей. Список SitePoint содержит много неточных типов MIME, и он далеко не полный. Официальный реестр IANA Media Types не заполнен (и, скорее всего, никогда не будет) заполнен на 100%.
Официальный список типов пантомимы можно найти в Управлении по присвоению номеров в Интернете (IANA) . Согласно списку их Content-Type
заголовку zip
IS application/zip
.
Тип носителя для rar
файлов официально не зарегистрирован в IANA, но неофициальное обычно используемое значение mime-type - application/x-rar-compressed
.
application/octet-stream
означает столько, сколько: «Я отправляю вам поток файлов, а содержимое этого потока не указывается» (поэтому верно, что это может быть файл zip
или rar
файл). Предполагается, что сервер обнаруживает фактическое содержимое потока.
Примечание: для загрузки небезопасно полагаться на тип пантомимы, установленный в Content-Type
заголовке. Заголовок устанавливается на клиенте и может быть установлен на любое случайное значение. Вместо этого вы можете использовать функции информации о файле php, чтобы обнаружить mime-тип файла на сервере.
Если вы хотите загрузить zip
файл и ничего больше, вы должны установить только одно Accept
значение заголовка. Любые дополнительные значения будут использоваться в качестве запасного варианта на тот случай, если сервер не сможет удовлетворить ваш Accept
запрос в заголовке mime-type.
Согласно спецификации 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
В связанном вопросе есть некоторый код 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 ) ) { ///
проверить все символы после последнего '.'