Guide développeur

Valider le vrai type d'un fichier uploadé côté serveur (au-delà de l'extension et du Content-Type)

L'extension et l'en-tête Content-Type d'un upload sont tous deux fournis par le client, donc falsifiables. Voici pourquoi la validation côté serveur doit s'appuyer sur la signature binaire du fichier.

Un formulaire d’upload reçoit deux informations sur le fichier envoyé : son nom (donc son extension) et l’en-tête Content-Type de la requête HTTP. Ces deux valeurs ont un point commun critique : elles sont toutes les deux définies par le client, pas par le serveur. Un attaquant contrôle totalement ce qu’il envoie dans ces deux champs, indépendamment du contenu réel du fichier — valider l’un ou l’autre revient à faire confiance à une donnée fournie par la partie qu’on cherche justement à contrôler.

La seule information fiable est le contenu du fichier lui-même, tel qu’il arrive sur le serveur. Une validation robuste lit les premiers octets du fichier reçu et les compare à la signature binaire attendue pour le type autorisé — exactement le mécanisme qu’utilise un identifieur de fichier côté client, mais exécuté côté serveur, après réception, avant tout traitement ultérieur (stockage, redimensionnement, conversion, indexation).

Cette vérification doit intervenir avant toute autre étape du traitement, y compris avant l’enregistrement du fichier avec son extension d’origine : un fichier dont la signature ne correspond pas au type déclaré doit être rejeté ou, a minima, traité comme un type générique non fiable plutôt que selon le nom fourni. C’est en particulier le cas pour les formats conteneurs (ZIP, formats Office, formats basés sur ISOBMFF comme MP4 ou HEIC) où plusieurs formats distincts partagent une structure proche : la seule signature ne suffit alors pas toujours à distinguer précisément le contenu, et un contrôle de structure plus poussé peut être nécessaire selon le niveau de risque accepté.

Pour tester qu’une validation de ce type fonctionne réellement — qu’elle rejette bien un contenu invalide portant une extension correcte, et qu’elle accepte un contenu valide quelle que soit son extension — un fichier de test généré avec une signature binaire connue et un contenu contrôlé permet de vérifier les deux cas sans dépendre d’un vrai fichier ni d’un outil tiers.

Générer un fichier de test à la bonne signature →

Formats concernés

Voir aussi

Sources

Dernière mise à jour :