# python-magic: Der praktischste Weg, sich auf den Dateiinhalt statt auf die Dateiendung zu verlassen Wenn ein Server eine Bild-Upload-Funktion hat, tauchen irgendwann solche Anforderungen auf. * „Es wurde als `.png` hochgeladen… ist es wirklich ein PNG?“ * „Zuerst muss entschieden werden, ob die Datei ein Bild oder ein Dokument ist.“ * „Bevor ich einen externen Parser (Pillow/OpenCV) verwende, möchte ich zumindest den Typ prüfen.“ Der beste Ausgangspunkt ist hier nicht die **Dateiendung**, sondern der **Dateiinhalt**. Und das Tool, das die „inhaltbasierte Erkennung“ am einfachsten bereitstellt, ist `python-magic`. --- ## Was macht python-magic? {#sec-a08d76193220} `python-magic` ist ein Wrapper, der die C-Bibliothek **libmagic** in Python nutzbar macht. libmagic untersucht Merkmale wie den **Header (die ersten Bytes)** einer Datei, um deren Typ zu identifizieren. Diese Funktion wird auch von dem Unix‑Befehl `file` bereitgestellt. Kurz gesagt: * `file` (Linux‑Befehl) = „Schnittstelle, die im Terminal verwendet wird“ * `libmagic` = „Kern‑Engine (Erkennungslogik)“ * `python-magic` = „Schleifer Wrapper, der libmagic in Python aufruft“ In diesem Beitrag konzentrieren wir uns auf `python-magic` und erklären strukturiert, **wie das Engine‑System Dateitypen erkennt**. --- ## Wie funktioniert die Kern‑Engine (libmagic)? {#sec-3ca38aa1c6cf} ![Diagramm der Funktionsweise der libmagic‑Bibliothek](/media/editor_temp/6/0d5baf67-d72a-4f8d-9f1b-e273eaaba587.png) Die Essenz von libmagic ist einfach. > „Es liest eine Datenbank mit Regeln zur Dateityp‑Erkennung, prüft die Datei‑Bytes gemäß diesen Regeln und zieht die plausibelste Schlussfolgerung.“ Hierbei ist die Datenbank die **Magic‑Datenbank** (Magic‑Pattern‑DB), die zusammen mit `file`/libmagic verwendet wird. Sie wird üblicherweise als kompiliertes Format (`magic.mgc`) im System installiert. ### 1) Die „Magic‑Datei“ ist eine Sammlung von Regeln {#sec-0d6d47a4ad53} Diese Regeln bestehen im Wesentlichen aus folgenden Elementen: * **Wo zu schauen** (Offset: Position im Dateibuffer) * **Wie zu lesen** (Typ: Byte/Zeichen/Integer usw.) * **Was zu vergleichen** (erwarteter Wert/Pattern) * **Welche Schlussfolgerung** (Nachricht/MIME usw.) Die Dokumentation von `file` beschreibt die „Magic‑Patterns“ ebenfalls. Die Regeln werden Zeile für Zeile getestet (Offset/Typ/Wert/Nachricht) und bei Übereinstimmung in eine hierarchische Struktur von Untertests überführt. Wer mehr über den Linux‑Befehl `file` erfahren möchte, kann den folgenden Link nutzen. [Linux‑Befehl `file` verstehen](https://cmdbox.mikihands.com/file/) ### 2) Die Regel‑Datenbank hat einen „Text‑Quell“ und einen „kompilierten“ Teil {#sec-3692748a59f7} Die Magic‑Datenbank kann ursprünglich aus lesbaren Text‑Fragmenten bestehen, wird aber für die Performance oft als kompiliertes Binär‑DB (`.mgc`) bereitgestellt. ### 3) Letztlich geht es darum, „statt der Endung den Inhalt zu prüfen“ {#sec-9d312e1d9ed0} `file` ist seit langem ein Typ‑Schätzer, der den Inhalt statt der Endung betrachtet. `python-magic` bringt diese Philosophie in eine Zeile Python‑Code. --- ## Wie benutzt man python-magic? {#sec-d0f1c4230032} Es gibt zwei typische Anwendungsfälle. ### 1) MIME‑Typ abrufen (am praktischsten) {#sec-ffe8c3253960} Nützlich für Upload‑Verarbeitung, Routing, Logging/Monitoring. ```python import magic mime = magic.from_file("upload.bin", mime=True) print(mime) # z. B.: image/png ``` `python-magic` liefert die Dateityp‑Erkennung auf Basis von libmagic, wie es auch im offiziellen Dokumentation beschrieben ist. ### 2) Direkt aus Bytes erkennen (vorteilhaft für Upload‑Streams) {#sec-030160959863} Bevor die Datei auf die Festplatte geschrieben wird, möchte man oft nur einen Teil der hochgeladenen Bytes prüfen. ```python import magic with open("upload.bin", "rb") as f: head = f.read(4096) mime = magic.from_buffer(head, mime=True) print(mime) ``` (Die Puffer‑Erkennung eignet sich besonders als „erste Filterstufe vor dem Speichern“.) --- ## Wo ist es aus Entwicklersicht nützlich? {#sec-78dbbfda0e18} ### 1) Erste Verteidigungslinie bei Upload‑Validierung {#sec-ea23ba6ff650} * Nicht nur anhand der Endung unterscheiden * Mindestens prüfen, ob die Datei als Bild verarbeitet werden kann ### 2) Verzweigungspunkte im Verarbeitungspipeline {#sec-ef95b692a826} * Bei Bildern: in die Resize/Thumbnail‑Pipeline * Bei PDF/ZIP: in einen anderen Worker * Unbekannte Typen: isolieren/ablehnen/weitere Prüfung ### 3) Kosten senken, bevor ein „schwerer Decoder“ aufgerufen wird {#sec-508e3c95c8ee} Decoder wie Pillow sind mächtig, aber ihr Aufruf kostet Speicher/CPU und erhöht die Angriffsfläche. `python-magic` hilft, vorher zu entscheiden, ob ein solcher Aufruf sinnvoll ist. > Wichtiger Real‑World‑Check: libmagic ist ein **Schätzungs‑/Erkennungs‑Tool**. Für eine sichere Erkennung (z. B. Blockierung bösartiger Payloads) sind zusätzliche Prüfungen (Whitelist, Größenbeschränkung, Sandbox‑Decodierung) nötig. --- ## Fazit: python-magic ist die leichteste Möglichkeit, Dateityp‑Erkennung in Code zu bringen {#sec-3b1611aa0fb2} `python-magic` liefert nicht die Bildverarbeitung selbst, sondern sagt schnell, **wie die Datei behandelt werden soll**. * Engine: libmagic (wie `file`) * Erkennungs‑Methode: „Regel‑DB + Byte‑Prüfung“ * In der Praxis: besonders nützlich für Upload‑Validierung, Routing und Kosten‑Reduktion Wenn man diese Technik beherrscht, kann man selbst in Umgebungen ohne umfangreiche Bibliotheken eine robuste „Erkennung → Verzweigung → Sicherheits‑Schicht“ aufbauen. --- ## Vorschau des nächsten Beitrags {#sec-832d5436b8b1} * Wir werden die Methoden `open()`, `load()` und `verify()` von Pillow (PIL) untersuchen, was sie garantieren, wann welche Methode eingesetzt wird und wie sie funktionieren. --- **Weitere Artikel** - [Wie Entwickler die Struktur von Bilddateien sehen? Bilddateien auseinandernehmen](/ko/whitedec/2026/1/14/developer-view-image-file-common-structure/)