мой вопрос: Есть ли какое-то отношение между расширением файла и типом mime? Я имею в виду, если я получу файл, например, .php и изменим его расширение на .png, также изменится его тип mime?Какова связь между типом Mime и расширением файла
ответ
Короткий ответ: Да.
Немного более длинный ответ: типы MIME и расширения файлов предоставляют подсказки о том, как обращаться с файлом. В то время как расширения файлов обычно используются для вашей ОС, чтобы решить, какую программу открыть файл, типы Mime используются вашим браузером, чтобы решить, как представить некоторые данные (или сервер о том, как интерпретировать полученные данные). Оба варианта являются необязательными, но это хорошая практика для достижения соглашения. Изменение типа mime-файла выполняется в зависимости от вашего веб-сервера. Я считаю, что Apache имеет настройки где-то для сопоставления между расширениями и типами mime. Если у вас есть свой собственный задний конец выступающей содержимое, которое потенциально может служить содержание с любого произвольного типа пантомимы, например, в PHP:
<?php
// We'll be outputting a PDF
header('Content-Type: application/pdf');
...
или
<?php
header('Content-Type: application/javascript');
echo "//script code here"
Также по его другому вопросу, я не думаю, что изменение чего-то расширения файла будет иметь какое-то влияние на его тип mime. – georaldc
Nice @Josep Valls благодарит за ваш ответ. Я спрашиваю об этом, потому что мне нужно иметь сильную проверку при загрузке любого файла в систему. Бизнес требует, чтобы приложение проверяло файл, даже если пользователь менял его расширение сознательно, я подумал, что, возможно, если пользователь изменит его расширение, я бы даже мог проверить файл по типу mime, используя php-функции –
@georaldc, если пользователь меняет расширение файла, я все же могу гарантировать, что у него есть определенный тип с типом mime? –
Расширения файлов намеки на вид данные, содержащиеся в файле. MIME-типы - это метки для типа данных в файле. Одно расширение файла соответствует не более чем одному типу MIME. Один тип MIME сопоставляет нулю или больше расширений файлов. Хорошим примером является image/jpeg
, который соответствует как .jpg
, так и .jpeg
.
Теория в сторону, тип MIME, предоставленный вами браузером, как правило, надежный, но если у вас требуется определенность, тогда вы должны предположить, что браузер был взломан.
В таком случае на сервере с помощью PHP, вы можете проверить, что данный файл соответствует данному типу MIME с расширением Finfo:
$path = '/path/to/your/file.pdf';
$info = finfo_open(FILEINFO_MIME_TYPE);
switch (finfo_file($info, $fpath)) {
case 'application/pdf':
// hooray, this is what you want
// do whatever
break;
default:
throw new RuntimeException('I said give me a PDF!');
}
Или, если вы хотите простую функцию:
function is_mime_type($path, $mime) {
return (finfo_file(finfo_open(FILEINFO_MIME_TYPE), $path) === $mime);
}
if (is_mime_type('/path/to/file.pdf', 'application/pdf')) {
// hooray
}
Вот similar answer, который документирует другие подходы для достижения этой цели.
И вот an answer с вопросом о сопоставлении между расширениями файлов и типами MIME.
Nice @bishop, это «то, что я искал».Я проверю, работает ли он. –
Прохладный, дайте мне знать, если нет, я набрал его из памяти без проверки синтаксиса! – bishop
Не полагайтесь на расширение файла, которое пользователь дает вам или тип MIME, о котором говорит вам браузер: оба могут быть подделаны. Используйте анализ на стороне сервера (a la 'file' или [' finfo_file'] (http://php.net/manual/en/function.finfo-file.php)) для определения фактического содержимого. – bishop