8 votes

La détection du type MIME est-elle le meilleur moyen de détecter un type de fichier ?

Je travaille sur un formulaire de téléchargement en PHP qui ne doit autoriser que les fichiers MP3.

Lorsque le téléchargement est terminé, j'analyse le fichier pour vérifier s'il s'agit bien d'un MP3. La première étape est de détecter le type mime comme étant audio/mpeg . J'utilise les bibliothèques finfo_file() et fonctionne bien, sauf que pendant les tests, certains fichiers MP3 sont rejetés car leur type MIME est le suivant application/octet-stream .

Mes questions sont les suivantes :

  • Mon application doit-elle refuser définitivement ces fichiers MP3 ? Ils jouent en fait de l'audio.
  • Y a-t-il une raison pour laquelle ce type MIME est un MP3 ?
  • La détection du type MIME est-elle le moyen le plus sûr de connaître le type de fichier ?

3voto

Matt Borja Points 1361

Dans la plupart de mes applications où le téléchargement est nécessaire, je me contente parfois de valider le MIME transmis par le navigateur (client) par rapport à une liste de types MIME prédéfinis. Cette approche part du principe que si quelque chose de suspect se produit et que le navigateur est incapable de communiquer le type MIME d'un fichier en cours de téléchargement, je ne veux probablement pas prendre la peine de le traiter pour le moment.

<?php

$valid_mp3_mimes = array(
    'audio/mpeg',
    'audio/x-mpeg',
    'audio/mp3',
    'audio/x-mp3',
    'audio/mpeg3',
    'audio/x-mpeg3',
    'audio/x-mpeg-3',
    'audio/mpg',
    'audio/x-mpg',
    'audio/x-mpegaudio',
    'video/mpeg',
    'video/x-mpeg',
);

$uploaded_file_mime = $_FILES['upload_field_name']['type'];

if(!in_array($uploaded_file_mime, $valid_mp3_mimes))
{
    die('Upload is not a valid MP3 file.');
}

Vous pouvez estimer ou non que cette méthode est suffisante pour vos besoins. Le manuel PHP indique explicitement que ces informations sont disponibles si le navigateur a fourni cette information et que le type MIME n'est PAS vérifié du côté du serveur et ne doit donc pas être considéré comme acquis.

Une chose à prendre en considération est la disponibilité des ressources sur le serveur qui vous permettent d'authentifier le véritable type MIME d'un fichier.

En tant que développeurs PHP, nous aimons la flexibilité de créer du code indépendant de la plate-forme pour la plupart (par exemple, nos applications Web construites sur un système Windows exécutant XAMPP peuvent être déployées dans un environnement d'hébergement Linux avec très peu de modifications). Cependant, lors de la validation des types MIME, nous commençons à introduire des méthodes dépendantes de la plateforme qui nécessitent de vérifier l'existence de ces outils (comme "file" ou "finfo_file").

Voici une implémentation qui mérite d'être étudiée (tirée du dépôt GitHub de CodeIgniter), qui utilise ces outils et constitue un exemple de travail aussi complet que possible dans le cadre de PHP :

Type MIME du fichier détecte le type MIME (réel) du fichier téléchargé, si possible. https://github.com/EllisLab/CodeIgniter/blob/develop/system/libraries/Upload.php#L983


Sources

Manuel PHP Téléchargements par la méthode POST - http://www.php.net/manual/en/features.file-upload.post-method.php

Boîte à outils pour les webmasters Mime Types - http://www.webmaster-toolkit.com/mime-types.shtml

FILExt Fichier .MP3 - http://filext.com/file-extension/MP3

0voto

Brian Gordon Points 2551

Si vous voulez un moyen extrêmement robuste de détecter les types de fichiers sans faire confiance au client pour fournir le type MIME correct, utilisez la fonction fichier sous UNIX.

$ file Black\ Sands\ 01\ Prelude.mp3
Black Sands 01 Prelude.mp3: Audio file with ID3 version 2.2.0, contains: MPEG ADTS, layer III, v1, 320 kbps, 44.1 kHz, Stereo

$ file homework/math475-hw8.docx
homework/math475-hw8.docx: Microsoft Word 2007+

En PHP, vous pouvez utiliser la fonction exec pour l'invoquer.

0voto

bkconrad Points 1609

La meilleure méthode de détection des fichiers est l'utilisation du schéma "octet magique" ou "numéro magique", en plus de MIME. Unix file (ainsi que finfo_file ) utilise en fait des "octets magiques" pour effectuer cette détection de fichier. Donc, en résumé : oui.

Ne vous souciez pas tant de l'aspect de votre fichier que de ce que vous pouvez en faire. Tant qu'il est lu, le fichier devrait être correct.

Si vous realmente Si vous voulez aller plus loin, vous pouvez vérifier vous-même la présence des octets magiques. Il existe une liste d'entre eux ici .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X