Las firmas (magic bytes) que ocupan los primeros bytes de un archivo. Útiles para identificar tipos y para implementar validación.
Qué son los magic bytes
La mayoría de los formatos empiezan con una secuencia de bytes fija, conocida como magic bytes o firma de archivo. El sistema operativo y las aplicaciones la leen para decidir qué tipo de archivo tienen delante. Una extensión se cambia en un segundo; los magic bytes forman parte del propio binario, y por eso son una base fiable para validar.
Tanto el comando file de Linux como la clase finfo de PHP determinan así el tipo MIME.
Diagrama: bytes iniciales (magic bytes) de formatos comunes
La extensión es solo parte del nombre y un atacante puede cambiarla a voluntad: renombra shell.php a shell.jpg y la comprobación de extensión pasa. Los magic bytes miran el inicio real de los datos, así que renombrar no los engaña. Aun así son débiles frente a archivos políglotas que falsifican los primeros bytes, de modo que contrasta extensión, tipo MIME y magic bytes a la vez.
¿Cuántos bytes necesito para identificar PNG y JPEG?
PNG necesita ocho bytes (89 50 4E 47 0D 0A 1A 0A) y JPEG solo los tres primeros (FF D8 FF). En la práctica, leer unos doce bytes cubre de una vez todos los formatos habituales, incluidos ZIP (50 4B 03 04) y PDF (25 50 44 46). No hace falta cargar el archivo entero en memoria.
Los documentos de Office y los APK se detectan como ZIP.
Esa detección es correcta. docx, xlsx, pptx, APK, JAR y EPUB son todos contenedores ZIP y todos empiezan por 50 4B 03 04. Distinguirlos exige abrir el archivo y mirar dentro: [Content_Types].xml para docx, AndroidManifest.xml para un APK. No puedes permitir docx y rechazar APK solo con los magic bytes.