Je rencontre une difficulté technique et j'aimerais avoir votre avis. Actuellement, je développe un module sur un site Prestashop, où j'autorise l'ajout de fichiers de police d'écriture au format .ttf dans le BackOffice. Cependant, je tiens à sécuriser ce processus pour éviter l'ajout de fichiers malveillants.
Voici les vérifications que j'ai mises en place :
Un fichier .htaccess pour empêcher l'exécution de PHP dans le répertoire d'upload ;
Une taille maximale de fichier de 5 Mo ;
Renommage des fichiers avec un identifiant unique ;
Vérification de l'extension du fichier, qui doit être .ttf ;
Vérification du mime type, qui doit être 'font/ttf'.
Mon problème se situe au niveau de la vérification du mime type. En utilisant finfo_open() ou mime_content_type(), je récupère systématiquement le mime type 'application/font-sfnt', qui est apparemment déprécié selon l'IANA, alors que je souhaiterais obtenir 'font/ttf'.
J'ai aussi constaté que les fonctions mentionnées ci-dessus utilisent le fichier magic.mime de base, mais je ne le trouve pas dans mon installation WAMP. J'ai trouvé un fichier mime.types dans C:/wamp64/bin/apache/apache.X.X.X/conf/, mais 'application/font-sfnt' n'y est pas présent, alors que 'font/ttf' l'est...
PS : J'ai également testé avec Symfony/Mime, mais le problème persiste, car cette bibliothèque utilise également le finfo de PHP.
Avez-vous des pistes pour résoudre ce problème et récupérer le mime type correct 'font/ttf' ?
Ne te base pas sur le type MIME si ce n'est pas portable.
De toute façon :
ce n'est pas parce que le fichier a l'extension .ttf ou commence par les octets (magic bytes) 00 01 00 00 00 (en hexa) que ça en fait véritablement un fichier ttf. (et ça vaut pour tous les types de fichiers)
le type MIME est déterminé de la même manière via l'extension et/ou en cherchant une signature, ce n'est pas une analyse du fichier et encore moins une validation de son contenu
la seule façon de vérifier qu'un fichier est bien ce que l'on attend serait de le parser totalement
Tu auras beau écrire :
const TTF_SIGNATURE = "\x00\x01\x00\x00\x00";
$fp = fopen($_FILES['upload']['tmp_name'], 'r');
$signature = fread($fp, strlen(TTF_SIGNATURE));
fclose($fp);
if (TTF_SIGNATURE == $signature) {
// ce serait un fichier TTF
} else {
// ce n'est pas un fichier TTF
}
Ca n'empêche pas pour autant d'uploader un script PHP qui schématiquement serait : \x00\x01\x00\x00\x00<?php echo 'OWNED' mais pour qu'il soit exécuté il y aurait une faille au niveau du serveur (sa configuration), ce qui correspondrait à :
> Un fichier .htaccess pour empêcher l'exécution de PHP dans le répertoire d'upload
Baptiste JAN
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
Baptiste JAN