La cuestión de qué es un MP3 es un poco lanosa. Los archivos MP3 suelen contener un montón de desperdicios al principio y/o al final que no son marcos MP3 válidos. Por lo general, esto es para almacenar etiquetas ID3, pero no es raro encontrar archivos MP3 con datos sin sentido en los extremos por otras razones (por ejemplo, corte de secuencias ingenuo).
En la práctica, casi cualquier cosa puede ser un MP3, y muchos archivos binarios arbitrarios tendrán algo que parece un cuadro de MP3.Buscar ID3 y la información de longitud (como en la respuesta de Pekka) es un buen enfoque heurístico para tener una idea si un archivo es probablemente para ser MP3, pero eso no es suficiente si lo que tiene en mente está relacionado con la seguridad.
devuelve el tipo de archivo basado en la extensión (he comprobado sólo en Windows)
En realidad se devuelve la cadena de tipo de navegador web del usuario envió, que en Windows será determinado por el la extensión de archivo original, pero en Mac o Linux puede provenir de otras fuentes. De cualquier manera, al igual que el nombre de archivo, no es confiable. La computadora del usuario puede estar configurada incorrectamente o puede estar enviando deliberadamente la cadena de tipo de medio incorrecta para un archivo.
¿Hay una forma segura de hacerlo con las funciones nativas de php?
¿Cuál es su intención con 'seguro'? Si su objetivo es evitar que las personas carguen archivos MP3 que en realidad son otros tipos de archivos disfrazados, generalmente con el objetivo de inyectar contenido HTML, Java o Flash para ataques de scripts entre sitios, entonces no hay una forma realista de hacerlo. Puede crear archivos que son MP3 válidos y, sin embargo, también se pueden interpretar como otro tipo al mismo tiempo. (Ver ataques 'GIFAR', lo mismo es posible con MP3.)
Al final, el único enfoque que lo protege confiablemente de los ataques XSS es servir a los archivos cargados por el usuario no confiables desde un nombre de host diferente que no comparte contexto de seguridad con el sitio principal, por lo que la creación de scripts en sitios cruzados no gana nada. Una solución parcial que también puede considerar en su lugar o también es servir todos sus archivos con un encabezado Content-Disposition: attachment
(si no necesita alojar imágenes que se mostrarán en línea en una página).
[cómo comprobar si el archivo es una imagen o tipo de video en php versión 5.2.9?] (Http://stackoverflow.com/questions/3074527/how-to-check-whether-file-is-image-or -video-type-in-php-version-5-2-9) cubre los mismos motivos – Gordon