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
.pnghochgeladen… 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?
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)?

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
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.
2) Die Regel‑Datenbank hat einen „Text‑Quell“ und einen „kompilierten“ Teil
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“
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?
Es gibt zwei typische Anwendungsfälle.
1) MIME‑Typ abrufen (am praktischsten)
Nützlich für Upload‑Verarbeitung, Routing, Logging/Monitoring.
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)
Bevor die Datei auf die Festplatte geschrieben wird, möchte man oft nur einen Teil der hochgeladenen Bytes prüfen.
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?
1) Erste Verteidigungslinie bei Upload‑Validierung
- Nicht nur anhand der Endung unterscheiden
- Mindestens prüfen, ob die Datei als Bild verarbeitet werden kann
2) Verzweigungspunkte im Verarbeitungspipeline
- 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
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
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
- Wir werden die Methoden
open(),load()undverify()von Pillow (PIL) untersuchen, was sie garantieren, wann welche Methode eingesetzt wird und wie sie funktionieren.
Weitere Artikel