Определение MIME-типа файла

Далее

Расширения файлов лгут, любой может переименовать файл malware.exe в photo.jpg. Надёжный способ определить истинный формат файла, прочитать его первые несколько байтов: большинство форматов содержат в них подпись («магическое число»), которая уникально идентифицирует формат независимо от его названия. Данный детектор анализирует эту подпись, определяет стандартный тип MIME и указывает наиболее распространённое соответствующее расширение, позволяя проверить, соответствует ли загруженный файл заявленному клиентом формату.

Как работает обнаружение формата MIME

  1. 1

    Перетащите файл

    Любого размера; считываются только первые 4–16 КБ.

  2. 2

    Чтение магических байтов

    Большинство форматов начинаются с известной подписи.

  3. 3

    Сравнение с базой подписей

    Детектор использует те же правила, что и `file(1)` / libmagic.

  4. 4

    Вернуть MIME-тип и расширение

    Показывает тип медиа по RFC 6838, каноническое расширение и человеческое описание.

Примеры подписей

Формат Первые байты (в шестнадцатеричном формате) MIME
JPEG FF D8 FF image/jpeg
PNG 89 50 4E 47 0D 0A 1A 0A image/png
GIF87a 47 49 46 38 37 61 image/gif
GIF89a 47 49 46 38 39 61 image/gif
WebP 52 49 46 46 ... 57 45 42 50 image/webp
PDF 25 50 44 46 (%PDF) application/pdf
ZIP / JAR / ODT / DOCX 50 4B 03 04 application/zip (или конкретный файл)
gzip 1F 8B 08 application/gzip
MP4 (ISO BMFF) 00 00 00 XX 66 74 79 70 video/mp4
MP3 49 44 33 или FF FB audio/mpeg
FLAC 66 4C 61 43 audio/flac
WAV 52 49 46 46 ... 57 41 56 45 audio/wav
ELF (бинарный файл для Linux) 7F 45 4C 46 application/x-executable
Windows PE (exe) 4D 5A application/x-msdownload

Почему расширений недостаточно

Безопасность: Загруженный файл resume.pdf (на самом деле это .exe) обходит простые фильтры расширений; решение кроется в механизме обнаружения формата MIME на стороне сервера. – Несоответствие типа содержимого: браузер может отправить неверный формат MIME при загрузке; анализ магических байтов позволяет определить истинный тип данных. – Восстановленные резервные копии. Расширения иногда могут быть утеряны или удалены; функция анализа содержимого позволяет определить тип каждого файла.

Семейство форматов на основе ZIP

Большинство современных форматов по сути представляют собой архивы в формате ZIP, они начинаются с сигнатуры PK\x03\x04, как и любой ZIP-архив.

– Office Open XML: .docx, .xlsx, .pptx.

  • OpenDocument: .odt, .ods, .odp. – В формате EPUB: .epub. – АПК для Android: .apk. – Java JAR-файл: .jar.

Для их различения детектор просматривает содержимое файла ZIP в поисках файла манифеста ([Content_Types].xml для формата OOXML, mimetype, для форматов ODF/EPUB).

Полезные комбинации

– Первые 512 байтов охватывают большинство форматных подписей. – Первые 4 КБ охватывают форматы, основанные на ZIP-файлах, в которых манифест расположен позже в файле. – Первые 16 КБ охватывают специальные случаи использования, такие как некоторые мультимедийные контейнеры.

Не идеально

  • Файлы в обычном текстовом формате не содержат магических байтов; в таких случаях детектор использует эвристические методы проверки (отвечает ли файл требованиям формата UTF-8, напоминает ли он JSON или XML). – Зашифрованные или обезличенные файлы могут выглядеть как случайные байты без узнаваемой подписи. – Неоднозначность формата: оба кода audio/wav и video/avi начинаются с RIFF; детектор проверяет вторичный идентификатор (WAVE против AVI , расположенного на четырех байтах позже).

Часто задаваемые вопросы

Нет. Процесс обнаружения выполняется в вашем браузере: считываются лишь первые несколько килобайт данных и сравниваются с базой подписей на стороне клиента. Ни один из этих данных не покидает вашего устройства.

Поскольку форматы OOXML, ODF, EPUB и JAR все начинаются с сигнатуры ZIP, детектор анализирует содержимое файлов для поиска специфического для каждого формата манифеста и возвращает более точный код MIME (application/vnd.openxmlformats-...).

Система обнаруживает наивные изменения названий: файл с именем .exe, изменённый в .jpg, будет распознан как исполняемый по своим специфическим байтам. Сложные злоумышленники встраивают полезные данные в реальные медиафайлы или используют многоязычные файлы, соответствующие нескольким сигнатурам; такие методы позволяют обойти простые механизмы обнаружения.

В обычном тексте отсутствуют магические байты. Детектор использует эвристические критерии: является ли текст допустимым в формате UTF-8, JSON, XML или CSV; в противном случае используется кодировка text/plain.

База данных подписей является аналогичной (получена на основе правил Unix libmagic); результаты должны совпадать для стандартных форматов, тогда как для нестандартных или пользовательских форматов результаты могут отличаться.

Сопутствующие инструменты

Детектор информации браузера

Посмотрите, что сообщает ваш браузер: user agent, engine, version, OS, тип устройства, разрешение экрана, timezone, language и public IP.

Инструмент проверки возраста доменных имен

Узнайте, когда домен был впервые зарегистрирован, а также его возраст в годах, месяцах и днях с использованием данных WHOIS из реестра.

Проверка API-эндпоинта

Проверьте в браузере HTTP- или HTTPS-эндпоинт с разрешённым CORS: итоговый статус, доступные заголовки, время и ограниченный предпросмотр тела.

Тестер системы CORS

Отправьте предварительный (preflight) запрос OPTIONS по любому URL и проверьте Access-Control-Allow-Origin, заголовки и методы, возвращаемые сервером. Быстро устраняйте ошибки при обработке кросс-оригинальных запросов.

Проверка HTTP/2 и HTTP/3

Локально анализируйте вставленные заголовки ответа, чтобы определить наблюдаемую версию HTTP и объявление HTTP/3 в Alt-Svc.

CIDR-калькулятор

Рассчитайте сетевой адрес, широковещательную рассылку, диапазон хостов, используемые IP-адреса и маску подсети для любого блока IPv4 CIDR.

Инструмент доступен на других языках