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?
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)?

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
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
2) De regelsdatabase bestaat uit “tekstbron” en “gecompileerd resultaat”
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”
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?
Er zijn twee typische gebruikspatronen.
1) Het MIME-type ophalen (meest praktisch)
Handig voor uploadverwerking, routing en logging/metrics.
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)
Voordat je het bestand opslaat, wil je vaak snel herkennen op basis van een deel van de geüploade bytes.
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?
1) Eerste verdedigingslinie voor uploadvalidatie
- Niet alleen op extensie vertrouwen
- Minimaal bevestigen of het bestand als afbeelding kan worden verwerkt
2) Vertakkingspunt in de verwerkingspipeline
- 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”
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
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
- Wat garanderen
open(),load()enverify()van Pillow (PIL), wanneer je welke methode gebruikt, en hoe ze werken.
Gerelateerde artikelen