Fichiers de test cas limites — corrompus, tronqués, vides et mal étiquetés

36 fichiers · liens directs · sans pub · libre d'usage

Pas de bombe ZIPPas d’exécutablePas de signature malveillanteSHA-256 publiéExtraction sans risque

Le reste de cette bibliothèque répond à « donnez-moi un PNG valide ». Cette page répond à la question plus difficile : que fait votre code d’un fichier tronqué, vide, mal nommé, qui ment sur son type ou qui contient des données qu’il ne devrait pas contenir ? Ce sont ces envois-là qui arrivent en production, et ils sont si fastidieux à fabriquer à la main que la plupart des suites de tests ne les essaient tout simplement jamais.

Tous les fichiers ici sont sans danger. Pas de bombe ZIP, pas d’entrées à traversée de chemin, pas d’exécutables ni de chaînes de test de malware ; la plus grande archive se décompresse en moins d’un mégaoctet. Les modes de défaillance sont réels, les contenus ne sont pas dangereux, et le SHA-256 de chaque fichier est publié pour que vous puissiez l’épingler comme fixture.

Commencez par deux. Le fichier HTML nommé .jpg vous dit si un envoi d’image peut devenir du cross-site scripting stocké sur votre domaine. Le CSV contenant des formules piégées vous dit si vos exports arrivent dans le tableur d’un collègue sous forme de formules actives. Ce sont ces deux-là qui révèlent le plus souvent de vrais bugs.

Fichiers vides et quasi vides

Un envoi de zéro octet est l’oubli le plus courant. Les validateurs qui vérifient une taille maximale oublient souvent la taille minimale, et le code qui lit le premier octet avant de vérifier la longueur plante ici au lieu de renvoyer une erreur propre.

FichierCe qu’il testeTailleObtenir
zero-byte.txtTotalement vide. Teste la validation de taille minimale, les divisions par la longueur et le code qui lit un premier octet avant de vérifier qu’il existe.0 BTélécharger
one-byte.txtUn seul caractère. Trop petit pour contenir un en-tête valide, quel que soit le format : la détection du type doit échouer proprement.1 BTélécharger
empty-archive.zipUn ZIP structurellement valide, sans aucune entrée. L’extraction doit réussir et ne rien produire, sans lever d’exception.22 BTélécharger

Fichiers tronqués et corrompus

Ils ont un en-tête valide et des données incomplètes ou endommagées : c’est exactement à cela que ressemble un envoi interrompu. Le code qui fait confiance à l’en-tête et lit le reste en flux échouera ici, et l’endroit où il échoue vous dira si votre gestion des erreurs est bien là où vous le pensez.

FichierCe qu’il testeTailleObtenir
truncated.pngSignature PNG et IHDR valides, coupé au milieu des données d’image. Les décodeurs lèvent ici une erreur au lieu de renvoyer une image partielle.4 KBTélécharger
corrupt-crc.pngLongueur complète et structure correcte, mais un octet des données d’image a été inversé et le CRC enregistré ne correspond plus. Les décodeurs stricts le rejettent ; les plus tolérants renvoient des pixels erronés.9 KBTélécharger
truncated.jpgUn JPEG coupé à 60 %, sans marqueur de fin d’image. Beaucoup de décodeurs renvoient une image partiellement décodée au lieu d’échouer : mieux vaut savoir ce que fait le vôtre.603 BTélécharger
truncated.zipLe répertoire central est tronqué : c’est à cela que ressemble l’envoi interrompu d’une archive. C’est le ZIP corrompu le plus courant dans la réalité.3 KBTélécharger
malformed.jsonUne virgule finale, une clé sans guillemets et une accolade non fermée. Vérifie que votre parseur indique une position utile plutôt qu’une erreur générique.136 BTélécharger

Fichiers qui mentent sur leur type

L’extension dit une chose, les octets en disent une autre. Si votre gestionnaire d’envoi se fie à l’extension ou au Content-Type fourni par le navigateur, ils passeront. Le fichier HTML nommé .jpg est celui qui compte : renvoyé avec un type de contenu image, il est inoffensif ; servi en HTML depuis votre domaine, c’est une faille XSS stockée.

FichierCe qu’il testeTailleObtenir
actually-a-png.jpgUn vrai PNG avec une extension .jpg. Tout ce qui se fie à l’extension le confiera au mauvais décodeur.9 KBTélécharger
actually-html.jpgUn document HTML avec une extension .jpg. Si votre application l’enregistre puis le renvoie avec un type de contenu deviné, vous avez une faille XSS stockée.335 BTélécharger

Métadonnées et confidentialité

Une photo tout juste sortie d’un téléphone indique où elle a été prise et dans quel sens la tenir. Si vous ne supprimez pas la première information, vous divulguez la position de vos utilisateurs ; si vous ignorez la seconde, tous les portraits s’affichent couchés. Ce fichier contient les deux pour vérifier que votre chaîne gère chacune.

FichierCe qu’il testeTailleObtenir
exif-gps-orientation.jpgContient des coordonnées GPS (la Tour CN, à Toronto) et l’orientation 6, c’est-à-dire une rotation de 90 degrés dans le sens horaire pour l’afficher à l’endroit. Il permet de vérifier à la fois que vous supprimez la localisation et que vous respectez la rotation.1 KBTélécharger

Texte, encodage et fins de ligne

Une marque d’ordre des octets (BOM) qui devient un caractère visible dans la première colonne, des champs entre guillemets contenant des virgules et de vrais sauts de ligne, trois fins de ligne différentes dans un même fichier, et aucune fin de ligne à la fin. Chacun de ces cas est banal dans les fichiers que vous envoient de vrais utilisateurs.

FichierCe qu’il testeTailleObtenir
bom-crlf-quoted.csvUne marque d’ordre des octets (BOM) UTF-8, des fins de ligne CRLF, des champs entre guillemets contenant des virgules, des guillemets doubles échappés, un saut de ligne littéral dans un champ et des noms non ASCII. Si le BOM apparaît dans l’en-tête de votre première colonne, c’est le bug.180 BTélécharger
unicode-torture.txtDes diacritiques combinants, une espace de largeur nulle, un forçage de droite à gauche, des caractères hors du plan multilingue de base et un emoji drapeau de six points de code. Teste le comptage de longueur, la troncature et la normalisation.565 BTélécharger
mixed-line-endings.txtLF, CRLF et un CR seul dans le même fichier, sans fin de ligne sur la dernière ligne. Le code qui compte les lignes se contredit souvent ici.107 BTélécharger
no-trailing-newline.txtSe termine sans saut de ligne. Ajouter du contenu à ce fichier sans vérification fusionne deux enregistrements en un seul.48 BTélécharger

Noms de fichiers problématiques

C’est le nom, pas le contenu, qui est testé. Les noms longs débordent des colonnes de base de données et des limites du système de fichiers ; les noms non ASCII cassent les en-têtes Content-Disposition, l’échappement des URL et la gestion de l’Unicode composé ou décomposé sur macOS.

FichierCe qu’il testeTailleObtenir
文件名-with spaces-🌲.txtDes caractères chinois, des espaces et un emoji dans le nom du fichier. Teste l’encodage de Content-Disposition, l’échappement des URL et la normalisation Unicode décomposée de macOS.194 BTélécharger

Limites de structure et de ressources

Des fichiers valides, plus encombrants que défectueux : une archive de dix mille entrées, du JSON plus profondément imbriqué que ce que la plupart des parseurs acceptent par défaut, et une archive chiffrée. Aucun n’est une attaque : ce sont simplement les formes qui épuisent les ressources d’une implémentation naïve.

FichierCe qu’il testeTailleObtenir
many-entries-10000.zipDix mille petites entrées, moins de 1 Mo au total une fois décompressées. Teste l’analyse du répertoire central et le coût par entrée. Volontairement pas une bombe ZIP.1.6 MBTélécharger
deeply-nested.json512 niveaux d’imbrication. Du JSON valide, mais plus profond que ce que beaucoup de parseurs acceptent par défaut, et assez profond pour épuiser la pile d’un parseur récursif.3 KBTélécharger
encrypted-password-test.zipChiffré avec ZipCrypto ; le mot de passe est test. Sans mot de passe, l’extraction doit échouer proprement au lieu de produire des données incohérentes.292 BTélécharger

Injection de formules dans les tableurs

Une cellule CSV commençant par =, +, - ou @ est interprétée comme une formule à l’ouverture du fichier dans Excel, Google Sheets ou LibreOffice. Si votre application exporte en CSV du texte saisi par les utilisateurs sans échapper ces préfixes, vous livrez leurs saisies sous forme de formules exécutables. Les charges utiles proposées ici calculent une arithmétique inoffensive.

FichierCe qu’il testeTailleObtenir
formula-injection.csvDes cellules qui commencent par =, +, - et @, que les tableurs interprètent comme des formules. Les charges utiles calculent une opération arithmétique inoffensive et l’une crée un lien vers ce site. Aucune n’exécute de commande.189 BTélécharger

Modèles 3D : maillages vides, défectueux et trompeurs

Le code de traitement des maillages suppose souvent un modèle fermé, de taille raisonnable, correctement orienté et doté d’au moins un triangle. Les utilisateurs envoient tout le reste. Ces fichiers couvrent le maillage vide, les triangles d’aire nulle et retournés, un maillage non-manifold, des coordonnées trop grandes ou trop petites pour être bien gérées en float32, un GLB coupé en plein envoi, un STL dont l’en-tête ment, un GLB qui se fait passer pour un STL, et le STL binaire qui piège la vérification classique « commence par solid donc ASCII ». Ils se trouvent dans le dossier 3D ; les exemples 3D valides sont dans la catégorie Modèles 3D.

FichierCe qu’il testeTailleObtenir
empty-mesh-zero-triangles.stlUn STL binaire structurellement valide : l’en-tête de 80 octets, un nombre de triangles égal à 0, et rien d’autre (84 octets). Le code de boîte englobante, de centrage et de miniature divise souvent par zéro ou indexe un tableau vide ici.84 BTélécharger
empty-scene-no-meshes.glbUn binaire glTF 2.0 valide avec une scène et un nœud vide, mais sans maillage, buffer ni matériau. Il passe le validateur Khronos. Les visionneuses doivent afficher une scène vide, pas lever d’exception.276 BTélécharger
degenerate-triangles.stlUn cube de 10 mm plus six triangles d’aire nulle : sommets répétés, points colinéaires et un éclat plus fin que l’epsilon. Le calcul des normales divise alors par une longueur nulle, et c’est de là que viennent les normales NaN.984 BTélécharger
flipped-normals-inside-out.stlUn cube de 10 mm dont tous les triangles sont orientés dans le sens horaire et dont les normales enregistrées pointent vers l’intérieur. Avec l’élimination des faces arrière, il s’affiche noir ou invisible, et son volume signé est négatif.684 BTélécharger
non-manifold-open-box-and-fins.stlUne boîte sans couvercle (un bord ouvert) plus deux ailettes qui partagent chacune une arête avec deux autres faces. Non imprimable tel quel ; les slicers et outils de réparation doivent signaler les deux problèmes.684 BTélécharger
huge-coordinates-1e7.stlUn cube de 100 unités centré à dix millions d’unités de l’origine. À cette échelle, un float32 ne représente que des nombres entiers : problèmes de précision, de plan lointain de la caméra et de cadrage automatique apparaissent tous.684 BTélécharger
tiny-scale-1e-6.stlUn cube d’un millionième d’unité de côté. Lu en millimètres, il mesure un micromètre : il teste les contrôles de taille minimale, la détection d’unité et tout epsilon servant à fusionner les sommets.684 BTélécharger
extreme-float-values.stlDes coordonnées de sommets à ±3,0e38, près du maximum d’un float32, et un triangle fait de valeurs sous-normales 1e-40. Le fichier ne contient ni NaN ni Infinity, mais calculer la taille de la boîte englobante en float32 déborde vers Infinity.234 BTélécharger
truncated.glbLes premiers 60 % d’un GLB texturé valide. L’en-tête annonce toujours la longueur complète et le bloc BIN s’arrête trop tôt : c’est à cela que ressemble l’envoi interrompu d’un GLB.80 KBTélécharger
wrong-triangle-count-header.stlUn STL binaire dont le compteur uint32 annonce 1 000 triangles alors que le fichier en contient 12. Un lecteur qui fait confiance au compteur lit au-delà de la fin ; un lecteur strict rejette le fichier, car 84 + 50 × 1 000 ne correspond pas à sa taille.684 BTélécharger
actually-a-glb.stlUn vrai GLB valide (il commence par les octets glTF) enregistré avec une extension .stl. Tout ce qui se fie à l’extension le confie au parseur STL.21 KBTélécharger
binary-stl-header-starts-with-solid.stlUn STL binaire valide dont l’en-tête en texte libre commence par le mot solid, comme l’écrivent plusieurs exporteurs réels. Détecter un STL ASCII par ce préfixe envoie ce fichier au mauvais parseur ; comparez plutôt la taille au nombre de triangles.684 BTélécharger
obj-missing-mtl.objUn OBJ par ailleurs valide dont la ligne mtllib désigne un fichier de matériaux inexistant. La géométrie doit tout de même se charger avec un matériau par défaut et un avertissement, sans échouer.914 BTélécharger
obj-negative-indices.objUn OBJ valide dont les faces utilisent des indices négatifs relatifs (f -3 -2 -1), ce que le format autorise. Beaucoup de parseurs écrits à la main ne gèrent que les indices positifs.675 BTélécharger
立方体 cube-modèle-🧊.stlUn cube valide de 10 mm dont le nom mélange caractères chinois, lettre accentuée, espace et emoji. Teste Content-Disposition, l’encodage des URL et les clés de stockage lors de l’envoi de modèles.684 BTélécharger

Petite liste de contrôle pour la gestion des envois

  1. Vérifiez une taille minimale autant qu’une taille maximale. Les envois de zéro octet sont le cas le plus souvent oublié.
  2. Déterminez le type à partir des octets, jamais à partir de l’extension ni du type de contenu fourni par le navigateur. Les deux sont contrôlés par l’attaquant.
  3. Servez les fichiers envoyés par les utilisateurs depuis un domaine distinct, ou avec Content-Disposition: attachment et X-Content-Type-Options: nosniff, pour qu’un fichier qui s’avère être du HTML ne puisse pas s’exécuter sur votre origine.
  4. Supprimez les données EXIF avant de publier une image, et appliquez la balise d’orientation avant de les supprimer.
  5. Échappez les =, +, - et @ en début de valeur quand vous écrivez du texte utilisateur dans un CSV.
  6. Fixez des limites explicites au nombre d’entrées d’une archive, à la taille totale décompressée et à la profondeur de récursion des parseurs, et renvoyez une erreur claire quand l’une d’elles est atteinte.
  7. Décidez du sort d’un fichier partiellement envoyé, puis testez-le avec les fichiers tronqués proposés ici au lieu de supposer.

Questions fréquentes

Ces fichiers sont-ils dangereux ?

Non. Pas de bombe ZIP, pas d’entrées à traversée de chemin, pas d’exécutables, pas de macros ni de chaînes de test de malware. Le plus gros fichier se décompresse en moins d’un mégaoctet. Les modes de défaillance sont réels (une image tronquée est vraiment tronquée), mais rien ici n’attaque la machine qui l’ouvre. Les formules du tableur calculent une arithmétique inoffensive au lieu d’exécuter une commande.

À quoi sert le fichier HTML avec une extension .jpg ?

C’est le fichier le plus précieux du pack. Si votre application l’accepte comme image, le stocke, puis le resservit plus tard avec un type de contenu deviné d’après son contenu, un navigateur l’affichera comme une page de votre domaine. C’est du cross-site scripting stocké, livré via un envoi d’image. Accepter le fichier ne pose pas de problème ; le resservir en HTML, si.

Pourquoi le CSV contient-il des cellules commençant par un signe égal ?

Parce qu’Excel, Google Sheets et LibreOffice interprètent une cellule commençant par =, +, - ou @ comme une formule. Si votre application exporte en CSV du texte saisi par les utilisateurs sans échapper ces préfixes, ce qu’un utilisateur a tapé dans un formulaire arrive dans le tableur d’un collègue sous forme de formule active. La solution : préfixer ces cellules d’une apostrophe ou les entourer de guillemets à l’export.

La photo contient-elle vraiment des coordonnées GPS ?

Oui : la tour CN de Toronto, à 43,6426 nord et 79,3871 ouest, plus une altitude. Elle porte aussi Orientation 6, ce qui signifie qu’une visionneuse doit la faire pivoter de 90 degrés dans le sens horaire pour l’afficher à l’endroit. À elles deux, ces données couvrent ce que toute chaîne de traitement d’images doit gérer correctement : supprimer la localisation avant publication, et respecter la rotation pour que les portraits ne s’affichent pas de travers.

Puis-je les utiliser dans une suite de tests automatisés ?

Oui, c’est leur raison d’être. Chaque fichier est déterministe, son SHA-256 est publié ici, et les liens directs ont une longue durée de cache et des en-têtes CORS ouverts. Épinglez le hash dans votre test et vous saurez immédiatement si une fixture change un jour.

Un problème, ou quelque chose à améliorer ? Nous lisons chaque message et corrigeons vite.

Besoin de fichiers valides ?

La plupart des tests ont besoin d’un fichier qui fonctionne. Nous en publions aussi : de vraies images, vidéos, fichiers audio, documents, archives, données, polices et modèles 3D, en tailles exactes avec hashs publiés.