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