# python-magic: “de meest praktische manier om bestanden te identificeren op basis van inhoud in plaats van extensie” Wanneer je een afbeelding-uploadfunctie op een server implementeert, ontstaat er op een gegeven moment de volgende vraag. * “Het bestand is geüpload met de extensie `.png`… is het echt een PNG?” * “Moet ik eerst bepalen of het een afbeelding of een document is?” * “Voordat ik een externe parser (Pillow/OpenCV) gebruik, wil ik ten minste het type controleren.” In dat geval is het beste startpunt **niet** de extensie, maar de **inhoud** van het bestand. En het meest eenvoudige hulpmiddel om deze “inhoudgebaseerde identificatie” te doen is `python-magic`. --- ## Wat doet python-magic? {#sec-a08d76193220} `python-magic` is een wrapper die de C-bibliotheek **libmagic** in Python beschikbaar maakt. libmagic analyseert kenmerken zoals de **header (de eerste paar bytes)** van een bestand om het type te bepalen. Deze functionaliteit is ook beschikbaar via het Unix-commando `file`. Kort samengevat: * `file` (Linux-commando) = “interface die je in de terminal gebruikt” * `libmagic` = “kernengine (identificatielogica)” * `python-magic` = “dunne wrapper die libmagic vanuit Python aanroept” In dit artikel richten we ons op `python-magic` en leggen we gestructureerd uit **hoe de engine het bestandstype bepaalt**. --- ## Hoe werkt de kernengine (libmagic)? {#sec-3ca38aa1c6cf} ![Diagram van de werking van de libmagic-bibliotheek](/media/editor_temp/6/0d5baf67-d72a-4f8d-9f1b-e273eaaba587.png) De essentie van libmagic is eenvoudig. > “Het leest een **database met regels voor bestandsherkenning**, controleert de bytes van het bestand volgens die regels en trekt de meest waarschijnlijke conclusie.” Hier is de database de **magic database** (magic pattern DB) en `file`/libmagic gebruiken deze samen. Meestal wordt die als gecompileerde variant (`magic.mgc`) op het systeem geïnstalleerd. ### 1) De “magic file” is een verzameling regels {#sec-0d6d47a4ad53} Deze regels bestaan in principe uit de volgende onderdelen. * **Waar te kijken** (offset: positie in het bestand) * **Hoe te lezen** (type: byte/tekst/integer, etc.) * **Wat te vergelijken** (expected value/pattern) * **Welke conclusie te trekken** (message/MIME, etc.) De handleiding van `file` beschrijft ook dat het “magic patterns” controleert. Deze regels worden regel voor regel getest (offset/type/waarde/bericht) en als de voorwaarde klopt, gaat de engine dieper een hiërarchische structuur in met specifiekere subtests. Wil je meer weten over het `file`-commando van Linux? Klik dan op de onderstaande link. [Meer over het Linux-file-commando](https://cmdbox.mikihands.com/file/) ### 2) De regelsdatabase bestaat uit “tekstbron” en “gecompileerd resultaat” {#sec-3692748a59f7} De magic DB kan oorspronkelijk een verzameling leesbare tekstfragmenten zijn, maar voor prestaties wordt deze vaak ook geleverd als een gecompileerde binaire DB (`.mgc`). ### 3) Uiteindelijk: “kijken naar inhoud in plaats van extensie” {#sec-9d312e1d9ed0} `file` is al lang een type-schatter die naar de inhoud kijkt in plaats van naar de extensie. `python-magic` brengt die filosofie naar één regel Python-code. --- ## Hoe gebruik je python-magic? {#sec-d0f1c4230032} Er zijn twee typische gebruikspatronen. ### 1) Het MIME-type ophalen (meest praktisch) {#sec-ffe8c3253960} Handig voor uploadverwerking, routing en logging/metrics. ```python import magic mime = magic.from_file("upload.bin", mime=True) print(mime) # bijvoorbeeld: image/png ``` `python-magic` biedt bestandsherkenning op basis van libmagic, zoals ook in de officiële beschrijving staat. ### 2) Direct herkennen uit bytes (handig voor uploadstreams) {#sec-030160959863} Voordat je het bestand opslaat, wil je vaak snel herkennen op basis van een deel van de geüploade bytes. ```python import magic with open("upload.bin", "rb") as f: head = f.read(4096) mime = magic.from_buffer(head, mime=True) print(mime) ``` (Buffer-gebaseerde herkenning is vooral goed als “eerste filter vóór het opslaan”.) --- ## Waar is het nuttig vanuit een ontwikkelaarsperspectief? {#sec-78dbbfda0e18} ### 1) Eerste verdedigingslinie voor uploadvalidatie {#sec-ea23ba6ff650} * Niet alleen op extensie vertrouwen * Minimaal bevestigen of het bestand als afbeelding kan worden verwerkt ### 2) Vertakkingspunt in de verwerkingspipeline {#sec-ef95b692a826} * Als afbeelding: naar de resize/thumbnail-pipeline * PDF/ZIP: naar een andere worker * Onbekend type: isoleren/weigeren/extra verificatie ### 3) Kosten verlagen vóór het aanroepen van “zware decoders” {#sec-508e3c95c8ee} Pillow en andere decoders zijn krachtig, maar het aanroepen ervan brengt kosten (geheugen/CPU/aanvalsoppervlak) met zich mee. `python-magic` is ideaal om eerst te bepalen **of het de moeite waard is**. > Belangrijk realistisch punt: libmagic is een **schatting/identificatie-tool**. Voor volledige beveiliging (malwareblokkering, etc.) zijn aanvullende controles nodig (whitelisting, groottelimieten, sandbox-decodering, etc.). --- ## Afsluiting: python-magic is de lichtste manier om bestandsherkenning in code te brengen {#sec-3b1611aa0fb2} `python-magic` levert niet de afbeeldingsverwerking zelf. Het geeft je in plaats daarvan snel aan **hoe je het bestand moet behandelen**. * Engine: libmagic (zoals `file`) * Herkenningsmethode: “regels-DB + bytecontrole” * In de praktijk: nuttig voor uploadvalidatie, routing en kostenreductie Door dit te leren, kun je zelfs in omgevingen zonder uitgebreide bibliotheken een **herkenning → routing → beveiliging**-keten opzetten. --- ## Vooruitblik op het volgende artikel {#sec-832d5436b8b1} * Wat garanderen `open()`, `load()` en `verify()` van Pillow (PIL), wanneer je welke methode gebruikt, en hoe ze werken. --- **Gerelateerde artikelen** * [Hoe een ontwikkelaar de structuur van een afbeeldingsbestand ziet? Laten we het bestand ontleden](/whitedec/2026/1/14/developer-view-image-file-common-structure/)