python-magic: la forma más práctica de confiar en el contenido del archivo en lugar de la extensión
Cuando se añade una función de carga de imágenes a un servidor, pronto surgen estas necesidades.
- “Sube como
.png, pero ¿es realmente PNG?” - “Primero hay que decidir si el archivo es una imagen o un documento.”
- “Antes de usar un parser externo (Pillow/OpenCV), quiero comprobar al menos el tipo.”
El punto de partida más sólido es el contenido del archivo, no la extensión.
Y la herramienta más sencilla para obtener esa “determinación basada en el contenido” es python-magic.
¿Qué hace python-magic?
python-magic es un wrapper que permite usar la librería C libmagic desde Python. libmagic inspecciona características como el cabezal (los primeros bytes) de un archivo para identificar su tipo. Esta funcionalidad también está disponible en el comando Unix file.
En resumen:
file(comando Linux) = “interfaz de terminal”libmagic= “motor central (lógica de detección)”python-magic= “wrapper ligero que llama a libmagic desde Python”
Este artículo se centra en python-magic y explica de forma estructurada cómo el motor determina el tipo de archivo.
¿Cómo funciona el motor central (libmagic)?

La esencia de libmagic es simple.
“Lee una base de datos de reglas de detección de tipos de archivo, inspecciona los bytes del archivo según esas reglas y llega a la conclusión más probable.”
La base de datos es el magic database (BD de patrones mágicos) que se instala junto con file/libmagic, normalmente en forma compilada (magic.mgc).
1) El “archivo mágico” es un conjunto de reglas
Estas reglas se componen de:
- Dónde mirar (offset: posición de bytes en el archivo)
- Cómo leer (tipo: byte/cadena/entero, etc.)
- Con qué comparar (valor/patrón esperado)
- Qué conclusión sacar (mensaje/MIME, etc.)
El manual de file describe que inspecciona magic patterns. Cada línea se prueba (offset/tipo/valor/mensaje) y, si coincide, se avanza a pruebas más específicas en una estructura jerárquica.
Para profundizar en el comando file de Linux, haz clic en el siguiente enlace:
Explorar el comando file de Linux
2) La BD de reglas tiene una versión “texto” y una “compilada”
El BD puede ser un conjunto de fragmentos de texto legibles por humanos, pero por rendimiento suele entregarse también en formato binario compilado (.mgc).
3) En última instancia, lo que hace es “mirar el contenido en lugar de la extensión”
file sigue la filosofía de detectar tipos mirando el contenido, no la extensión. python-magic trae esa filosofía a Python con una sola línea de código.
¿Cómo usar python-magic?
Hay dos patrones de uso comunes.
1) Obtener el tipo MIME (el más práctico)
Útil para procesamiento de carga, enrutamiento y métricas.
import magic
mime = magic.from_file("upload.bin", mime=True)
print(mime) # Ejemplo: image/png
python-magic identifica el tipo de archivo basado en libmagic, tal como lo hace el comando file.
2) Detectar directamente a partir de bytes (útil para flujos de carga)
A menudo se quiere inspeccionar solo los primeros bytes antes de escribir el archivo en disco.
import magic
with open("upload.bin", "rb") as f:
head = f.read(4096)
mime = magic.from_buffer(head, mime=True)
print(mime)
(La detección basada en buffer es especialmente buena como filtro de primera pasada antes de almacenar el archivo.)
¿Dónde resulta útil desde la perspectiva del desarrollador?
1) Primera línea de defensa en la validación de carga
- No depender solo de la extensión
- Confirmar mínimamente si el archivo puede ser tratado como imagen
2) Punto de bifurcación en la tubería de procesamiento
- Si es imagen → pipeline de redimensionado/thumbnail
- Si es PDF/ZIP → otro worker
- Si el tipo es desconocido → aislar/rechazar/validación adicional
3) Reducir costos antes de llamar a “decoders pesados”
Decoders como Pillow son potentes pero costosos en memoria/CPU y aumentan la superficie de vulnerabilidad. python-magic ayuda a decidir si vale la pena invocar ese decoder.
Nota importante: libmagic es solo una herramienta de estimación/detección. Si la seguridad completa (bloqueo de cargas maliciosas) es el objetivo, se requieren validaciones adicionales (lista blanca, límite de tamaño, decodificación en sandbox, etc.).
Conclusión: python-magic es la forma más ligera de traer la detección de tipos de archivo al código
python-magic no procesa imágenes; simplemente indica rápidamente cómo debe tratarse el archivo.
- Motor: libmagic (igual que
file) - Método de detección: “BD de reglas + inspección de bytes”
- En la práctica: útil para validación de carga, enrutamiento y ahorro de recursos
Conocerlo permite construir un flujo de “detección → bifurcación → protección” incluso en entornos con bibliotecas limitadas.
Próximo artículo
- Analizaremos qué garantizan los métodos
open(),load()yverify()de Pillow (PIL), cuándo usar cada uno y cómo funcionan internamente.
Ver artículos relacionados
No hay comentarios.