Fichiers de test cas limites — corrompus, tronqués, vides et mal étiquetés
36 fichiers · liens directs · sans pub · libre d'usage
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.
.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.
| Fichier | Ce qu’il teste | Taille | Obtenir |
|---|---|---|---|
zero-byte.txt | Totalement 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 B | Télécharger |
one-byte.txt | Un 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 B | Télécharger |
empty-archive.zip | Un ZIP structurellement valide, sans aucune entrée. L’extraction doit réussir et ne rien produire, sans lever d’exception. | 22 B | Té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.
| Fichier | Ce qu’il teste | Taille | Obtenir |
|---|---|---|---|
truncated.png | Signature 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 KB | Télécharger |
corrupt-crc.png | Longueur 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 KB | Télécharger |
truncated.jpg | Un 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 B | Télécharger |
truncated.zip | Le 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 KB | Télécharger |
malformed.json | Une 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 B | Té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.
| Fichier | Ce qu’il teste | Taille | Obtenir |
|---|---|---|---|
actually-a-png.jpg | Un vrai PNG avec une extension .jpg. Tout ce qui se fie à l’extension le confiera au mauvais décodeur. | 9 KB | Télécharger |
actually-html.jpg | Un 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 B | Té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.
| Fichier | Ce qu’il teste | Taille | Obtenir |
|---|---|---|---|
exif-gps-orientation.jpg | Contient 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 KB | Té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.
| Fichier | Ce qu’il teste | Taille | Obtenir |
|---|---|---|---|
bom-crlf-quoted.csv | Une 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 B | Télécharger |
unicode-torture.txt | Des 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 B | Télécharger |
mixed-line-endings.txt | LF, 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 B | Télécharger |
no-trailing-newline.txt | Se termine sans saut de ligne. Ajouter du contenu à ce fichier sans vérification fusionne deux enregistrements en un seul. | 48 B | Té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.
| Fichier | Ce qu’il teste | Taille | Obtenir |
|---|---|---|---|
文件名-with spaces-🌲.txt | Des 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 B | Té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.
| Fichier | Ce qu’il teste | Taille | Obtenir |
|---|---|---|---|
many-entries-10000.zip | Dix 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 MB | Télécharger |
deeply-nested.json | 512 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 KB | Télécharger |
encrypted-password-test.zip | Chiffré 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 B | Té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.
| Fichier | Ce qu’il teste | Taille | Obtenir |
|---|---|---|---|
formula-injection.csv | Des 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 B | Té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.
| Fichier | Ce qu’il teste | Taille | Obtenir |
|---|---|---|---|
empty-mesh-zero-triangles.stl | Un 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 B | Télécharger |
empty-scene-no-meshes.glb | Un 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 B | Télécharger |
degenerate-triangles.stl | Un 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 B | Télécharger |
flipped-normals-inside-out.stl | Un 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 B | Télécharger |
non-manifold-open-box-and-fins.stl | Une 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 B | Télécharger |
huge-coordinates-1e7.stl | Un 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 B | Télécharger |
tiny-scale-1e-6.stl | Un 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 B | Télécharger |
extreme-float-values.stl | Des 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 B | Télécharger |
truncated.glb | Les 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 KB | Télécharger |
wrong-triangle-count-header.stl | Un 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 B | Télécharger |
actually-a-glb.stl | Un 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 KB | Télécharger |
binary-stl-header-starts-with-solid.stl | Un 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 B | Télécharger |
obj-missing-mtl.obj | Un 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 B | Télécharger |
obj-negative-indices.obj | Un 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 B | Télécharger |
立方体 cube-modèle-🧊.stl | Un 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 B | Télécharger |
Petite liste de contrôle pour la gestion des envois
- Vérifiez une taille minimale autant qu’une taille maximale. Les envois de zéro octet sont le cas le plus souvent oublié.
- 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.
- Servez les fichiers envoyés par les utilisateurs depuis un domaine distinct, ou avec
Content-Disposition: attachmentetX-Content-Type-Options: nosniff, pour qu’un fichier qui s’avère être du HTML ne puisse pas s’exécuter sur votre origine. - Supprimez les données EXIF avant de publier une image, et appliquez la balise d’orientation avant de les supprimer.
- Échappez les
=,+,-et@en début de valeur quand vous écrivez du texte utilisateur dans un CSV. - 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.
- 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.