2010-07-09 7 views
5

Je construis un site Web où l'utilisateur peut télécharger des fichiers mp3. Et, je veux vérifier si le fichier est un fichier mp3. Ce que j'ai besoin de savoir, c'est s'il y a une fonction php qui fait ça pour moi.PHP Real type de fichier

J'ai essayé $_FILES['uploadedfile']['type']

Mais, je ne fonctionne pas comme je veux, car il renvoie le type de fichier en fonction de l'extension (je l'ai testé uniquement sur Windows)

Ainsi, les questions sont:

  1. Il existe un moyen sûr de le faire avec des fonctions natives php?
  2. Le type de fichier basé sur l'extension, est un problème php ou est-il lié au système d'exploitation?
  3. Que me recommandez-vous ??

Merci.

+0

[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

Répondre

7

1- Il existe un moyen sûr de le faire avec des fonctions natives php?

Pour les MP3, pas avec les fonctions natives PHP, non.

Il existe fileinfo qui utilise la fonctionnalité "MIME sniffing" du système d'exploitation. Si installé, c'est généralement assez fiable.

Alternativement, la bibliothèque getID3 prétend être en mesure d'extraire des informations à partir de fichiers MP3. Si vous pouvez obtenir un temps de lecture à partir du fichier, il est probable qu'il s'agit d'un fichier MP3 valide.

2- Le type de fichier basé sur l'extension, est un problème php ou est-il lié au système d'exploitation?

Aucune. Le navigateur détermine le type de fichier (en fonction de l'extension habituellement) et envoie un type MIME. Comme avec toutes les données entrantes, il est très facile de truquer et ne peut jamais faire confiance.

+1

+1 pour getID3. Je l'ai déjà utilisé pour vérifier si un film QuickTime contient des conseils de diffusion. Très, très utile. –

1

Vous souhaitez examiner les types MIME. L'extension fileinfo de PHP est le moyen préféré de le faire.

1

Ouvrez le fichier après son téléchargement et vérifiez les premiers octets pour voir s'il correspond à ce qui devrait être dans un en-tête de fichier mp3.

+0

premiers octets peuvent également être ID3 –

+0

Je n'ai pas dit ce que les premiers octets pourraient être, donc je ne sais pas comment cela s'applique à ma réponse. Êtes-vous sûr que vous ne vouliez pas dire cela comme une réponse à l'une des autres réponses? – GrandmasterB

3

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

+0

Oui, je ne sais pas. Je vois toujours comment YouTube vous permet de télécharger quelque chose mais, si ce n'est pas une vidéo, il vous dit "désolé". Je pense que j'ai à peu près l'information que je veux. Merci. – mRt