MIME 타입 감지기

다음

파일 확장자는 거짓말을 합니다, 누구나 malware.exephoto.jpg로 바꿀 수 있습니다. 파일이 정말 무엇인지 아는 믿을 만한 방법은 처음 몇 바이트를 읽는 것입니다. 대부분의 형식이 거기에 이름과 무관하게 형식을 식별하는 시그니처(“매직 넘버”)를 넣습니다. 이 감지기는 드롭한 파일의 시그니처를 읽어 표준 MIME 타입과 가장 흔한 확장자 매핑을 반환하므로, 업로드가 클라이언트가 주장하는 것과 같은지 검증할 수 있습니다.

MIME 감지 작동 방식

  1. 1

    파일 드롭

    어떤 크기든. 처음 4~16KB만 읽습니다.

  2. 2

    매직 바이트 읽기

    대부분의 형식이 알려진 시그니처로 시작합니다.

  3. 3

    시그니처 데이터베이스와 대조

    감지기는 `file(1)` / libmagic과 같은 규칙을 씁니다.

  4. 4

    MIME + 확장자 반환

    RFC 6838 미디어 타입, 표준 확장자, 사람이 읽는 라벨을 보여줍니다.

예시 시그니처

형식 첫 바이트(16진) 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

확장자만으로 부족한 이유

  • 보안. 실제로는 .exe인 업로드된 resume.pdf는 순진한 확장자 필터를 우회합니다. 서버 측 MIME 감지가 해결책입니다.
  • Content-Type 불일치. 브라우저가 업로드에 잘못된 MIME을 보낼 수 있습니다. 매직 바이트를 읽으면 데이터가 실제로 무엇인지 알 수 있습니다.
  • 복원된 백업. 확장자는 때때로 사라지거나 제거됩니다. 콘텐츠 스니핑으로 각 파일이 무엇인지 식별할 수 있습니다.

ZIP 기반 계열

많은 현대 형식이 내부적으로 ZIP 아카이브입니다, 어떤 ZIP처럼 PK\x03\x04로 시작합니다:

  • Office Open XML: .docx, .xlsx, .pptx.
  • OpenDocument: .odt, .ods, .odp.
  • EPUB: .epub.
  • Android APK: .apk.
  • Java JAR: .jar.

이들을 구분하려고 감지기는 ZIP 안의 매니페스트 파일(OOXML은 [Content_Types].xml, ODF / EPUB는 mimetype)을 들여다봅니다.

유용한 조합

  • 처음 512바이트가 대부분의 형식 시그니처를 다룹니다.
  • 처음 4KB가 매니페스트가 더 안쪽에 나타나는 ZIP 기반 형식을 다룹니다.
  • 처음 16KB가 일부 멀티미디어 컨테이너 같은 엣지 케이스를 다룹니다.

완벽하지 않음

  • 평문 파일은 매직 바이트가 없습니다. 감지기는 휴리스틱으로 폴백합니다(유효한 UTF-8인가? JSON이나 XML처럼 보이는가?).
  • 암호화/난독화된 파일은 인식 가능한 시그니처 없이 무작위 바이트처럼 보일 수 있습니다.
  • 형식 모호성. audio/wavvideo/avi 둘 다 RIFF로 시작합니다. 감지기는 보조 식별자(4바이트 뒤의 WAVEAVI )를 확인합니다.

자주 묻는 질문

아니요. 감지는 브라우저에서 실행됩니다, 처음 몇 KB만 읽어 클라이언트 측 시그니처 데이터베이스와 대조합니다. 아무것도 기기를 떠나지 않습니다.

OOXML, ODF, EPUB, JAR 모두 ZIP 시그니처로 시작하기 때문입니다. 감지기가 안을 들여다보고 형식별 매니페스트를 찾아 더 구체적인 MIME(application/vnd.openxmlformats-...)을 반환합니다.

순진한 이름 변경은 잡습니다, .jpg로 바꾼 .exe는 매직 바이트로 실행 파일로 표시됩니다. 정교한 공격자는 실제 미디어 파일 안에 페이로드를 숨기거나 여러 시그니처에 맞는 폴리글랏 파일을 써서 단순 감지를 무력화합니다.

평문은 매직 바이트가 없습니다. 감지기는 휴리스틱을 실행합니다: 유효한 UTF-8? 유효한 JSON? XML 선언? CSV 구조? 그 외에는 text/plain으로 폴백합니다.

시그니처 데이터베이스가 유사합니다(Unix libmagic 규칙에서 파생). 흔한 형식은 결과가 일치해야 합니다. 모호하거나 사용자 지정 형식은 다를 수 있습니다.

관련 도구

이 도구는 다른 언어로도 제공됩니다