La question de savoir ce qu'est un MP3 est un peu laineuse. Les fichiers MP3 contiennent généralement un tas de paillettes au début et/ou à la fin qui ne sont pas des images MP3 valides. Habituellement, il s'agit d'une balise ID3, mais il n'est pas rare de rencontrer des fichiers MP3 contenant des données non sensées à la fin pour d'autres raisons (par exemple, un hachage de flux naïf).
En pratique presque n'importe quoi peut être un MP3, et beaucoup de fichiers binaires arbitraires auront quelque chose qui ressemble à un cadre MP3.La recherche d'informations ID3 et de longueur (comme dans la réponse de Pekka) est une bonne approche heuristique pour avoir une idée si un fichier est MP3, mais ce n'est pas suffisant si ce que vous avez en tête est lié à la sécurité.
retourne le type de fichier basé sur l'extension (je l'ai testé uniquement sur Windows)
En fait, il retourne la chaîne de type navigateur Web de l'utilisateur envoyé qui sous Windows sera déterminée par la l'extension de fichier d'origine, mais sur Mac ou Linux peut provenir d'autres sources. De toute façon, comme le nom de fichier lui-même, il ne faut pas faire confiance. L'ordinateur de l'utilisateur peut être mal configuré ou envoyer délibérément la mauvaise chaîne de type de média pour un fichier.
Il existe un moyen sûr de le faire avec des fonctions natives php?
Quelle est votre intention avec 'safe'? Si votre objectif est d'empêcher les utilisateurs de télécharger des fichiers MP3 qui sont en réalité d'autres types de fichiers déguisés - généralement pour injecter du contenu HTML, Java ou Flash pour des attaques de script intersite -, il n'existe aucun moyen réaliste de le faire. Vous pouvez faire des fichiers qui sont des MP3 valides et qui peuvent être interprétés comme un autre type en même temps. En fin de compte, la seule approche qui vous protège de façon fiable contre les attaques XSS est de servir des fichiers téléchargés par des utilisateurs non fiables à partir d'un nom d'hôte différent qui ne partage aucun contexte de sécurité avec les attaques XSS. le site principal, de sorte que les scripts inter-sites n'y gagnent rien. Une solution partielle que vous pouvez également envisager à la place ou bien est de servir tous vos fichiers avec un en-tête Content-Disposition: attachment
(si vous n'avez pas besoin d'héberger des images qui seront affichées en ligne dans une page).
[comment vérifier si le fichier est de type image ou vidéo dans php version 5.2.9?] (Http://stackoverflow.com/questions/3074527/how-to-check-whether-file-is-image-ou -video-type-dans-php-version-5-2-9) couvre les mêmes motifs – Gordon