Grenzfall-Testdateien – defekt, abgeschnitten, leer und falsch benannt
36 Dateien · direkte Links · keine Werbung · frei nutzbar
Der Rest dieser Bibliothek beantwortet „Gib mir ein gültiges PNG“. Diese Seite beantwortet die schwierigere Frage: Was macht dein Code mit einer Datei, die abgeschnitten, leer oder falsch benannt ist, über ihren Typ lügt oder Daten enthält, die nicht hineingehören? Genau solche Uploads landen in der Produktion – und sie von Hand zu bauen ist so mühsam, dass die meisten Testsuites es nie versuchen.
Jede Datei hier ist sicher. Es gibt keine Zip-Bomben, keine Path-Traversal-Einträge, keine ausführbaren Dateien und keine Malware-Teststrings; das größte Archiv entpackt sich auf unter ein Megabyte. Die Fehlerbilder sind echt, die Inhalte ungefährlich, und der SHA-256 jeder Datei ist veröffentlicht, damit du sie als Fixture festschreiben kannst.
.jpg zeigt dir, ob ein Bild-Upload zu gespeichertem Cross-Site-Scripting auf deiner Domain werden kann. Die CSV mit Formel-Payloads zeigt dir, ob deine Exporte als aktive Formeln in der Tabelle eines Kollegen ankommen. Diese beiden finden am häufigsten echte Bugs.Leere und fast leere Dateien
Ein Upload mit null Byte ist das, was am häufigsten vergessen wird. Validatoren, die eine Maximalgröße prüfen, vergessen oft das Minimum, und Code, der das erste Byte liest, bevor er die Länge prüft, stürzt hier ab, statt sauber einen Fehler zurückzugeben.
| Datei | Was sie testet | Größe | Holen |
|---|---|---|---|
zero-byte.txt | Komplett leer. Testet die Validierung der Mindestgröße, Divisionen durch die Länge und Code, der ein erstes Byte liest, bevor er prüft, ob es eines gibt. | 0 B | Herunterladen |
one-byte.txt | Ein einzelnes Zeichen. Zu klein für einen gültigen Header in irgendeinem Format, die Typerkennung muss also sauber scheitern. | 1 B | Herunterladen |
empty-archive.zip | Ein strukturell gültiges ZIP ganz ohne Einträge. Das Entpacken sollte gelingen und nichts erzeugen, statt einen Fehler zu werfen. | 22 B | Herunterladen |
Abgeschnittene und beschädigte Dateien
Diese Dateien haben einen gültigen Header und unvollständige oder beschädigte Daten – genau so sieht ein abgebrochener Upload aus. Code, der dem Header vertraut und den Rest streamt, scheitert hier, und an welcher Stelle er scheitert, verrät dir, ob deine Fehlerbehandlung da sitzt, wo du sie vermutest.
| Datei | Was sie testet | Größe | Holen |
|---|---|---|---|
truncated.png | Gültige PNG-Signatur und IHDR, mitten in den Bilddaten abgeschnitten. Decoder werfen hier einen Fehler, statt ein Teilbild zu liefern. | 4 KB | Herunterladen |
corrupt-crc.png | Volle Länge und korrekte Struktur, aber ein Byte in den Bilddaten wurde gekippt, und die gespeicherte CRC passt nicht mehr. Strenge Decoder lehnen die Datei ab, nachsichtige liefern falsche Pixel. | 9 KB | Herunterladen |
truncated.jpg | Ein bei 60 Prozent abgeschnittenes JPEG ohne End-of-Image-Marker. Viele Decoder liefern ein teilweise dekodiertes Bild, statt zu scheitern – gut zu wissen, wie sich deiner verhält. | 603 B | Herunterladen |
truncated.zip | Das zentrale Verzeichnis ist abgeschnitten – so sieht der halb fertige Upload eines Archivs aus. Das ist das in der Praxis häufigste beschädigte ZIP. | 3 KB | Herunterladen |
malformed.json | Ein Komma am Ende, ein Schlüssel ohne Anführungszeichen und eine nicht geschlossene geschweifte Klammer. Testet, ob dein Parser eine brauchbare Position meldet statt eines allgemeinen Fehlers. | 136 B | Herunterladen |
Dateien, die über ihren Typ lügen
Die Dateiendung sagt das eine, die Bytes etwas anderes. Wenn dein Upload-Handler der Endung oder dem vom Browser gelieferten Content-Type vertraut, kommen diese Dateien durch. Entscheidend ist die HTML-Datei mit der Endung .jpg: Mit einem Bild-Content-Type ausgeliefert ist sie harmlos, als HTML von deiner Domain ausgeliefert ist sie gespeichertes Cross-Site-Scripting.
| Datei | Was sie testet | Größe | Holen |
|---|---|---|---|
actually-a-png.jpg | Ein echtes PNG mit der Endung .jpg. Alles, was anhand der Endung verteilt, gibt es an den falschen Decoder. | 9 KB | Herunterladen |
actually-html.jpg | Ein HTML-Dokument mit der Endung .jpg. Speichert deine Anwendung es und liefert es mit einem geratenen Content-Type wieder aus, hast du gespeichertes Cross-Site-Scripting. | 335 B | Herunterladen |
Metadaten und Datenschutz
Ein Foto direkt vom Smartphone verrät, wo es aufgenommen wurde und wie herum es gehört. Entfernst du das Erste nicht, gibst du die Standorte deiner Nutzer preis; ignorierst du das Zweite, erscheint jedes Hochformatfoto seitlich gedreht. Diese Datei enthält beides, so kannst du prüfen, ob deine Pipeline mit beidem umgeht.
| Datei | Was sie testet | Größe | Holen |
|---|---|---|---|
exif-gps-orientation.jpg | Enthält GPS-Koordinaten (der CN Tower in Toronto) und Orientation 6, also um 90 Grad im Uhrzeigersinn drehen, damit das Bild aufrecht steht. Prüfe damit, ob du Standortdaten entfernst und die Drehung berücksichtigst. | 1 KB | Herunterladen |
Text, Kodierung und Zeilenenden
Eine Byte-Order-Mark, die in der ersten Spalte als sichtbares Zeichen auftaucht, Felder in Anführungszeichen mit Kommas und echten Zeilenumbrüchen, drei verschiedene Zeilenenden in einer Datei und kein Zeilenende am Schluss. Jeder dieser Fälle ist in Dateien, die echte Nutzer dir schicken, ganz normal.
| Datei | Was sie testet | Größe | Holen |
|---|---|---|---|
bom-crlf-quoted.csv | Eine UTF-8-Byte-Order-Mark, CRLF-Zeilenenden, Felder in Anführungszeichen mit Kommas, maskierte doppelte Anführungszeichen, ein echter Zeilenumbruch innerhalb eines Feldes und Namen mit Nicht-ASCII-Zeichen. Taucht die BOM in der Überschrift deiner ersten Spalte auf, ist das der Fehler. | 180 B | Herunterladen |
unicode-torture.txt | Kombinierende Zeichen, ein nullbreites Leerzeichen, ein Rechts-nach-links-Override, Zeichen aus den Astralebenen und ein Flaggen-Emoji aus sechs Codepunkten. Testet Längenzählung, Kürzen und Normalisierung. | 565 B | Herunterladen |
mixed-line-endings.txt | LF, CRLF und ein einzelnes CR in einer Datei, ohne Zeilenende in der letzten Zeile. Code zum Zeilenzählen ist sich hier oft selbst uneins. | 107 B | Herunterladen |
no-trailing-newline.txt | Endet ohne Zeilenumbruch. Wer ungeprüft an diese Datei anhängt, verschmilzt zwei Datensätze zu einem. | 48 B | Herunterladen |
Schwierige Dateinamen
Getestet wird der Name, nicht der Inhalt. Lange Namen sprengen Datenbankspalten und Dateisystemgrenzen; Namen mit Nicht-ASCII-Zeichen bringen Content-Disposition-Header, URL-Escaping und den Unterschied zwischen zusammengesetztem und zerlegtem Unicode unter macOS durcheinander.
| Datei | Was sie testet | Größe | Holen |
|---|---|---|---|
文件名-with spaces-🌲.txt | Chinesische Zeichen, Leerzeichen und ein Emoji im Dateinamen. Testet die Kodierung von Content-Disposition, URL-Escaping und die Normalisierung von zerlegtem Unicode unter macOS. | 194 B | Herunterladen |
Struktur- und Ressourcengrenzen
Gültige Dateien, die eher unbequem als kaputt sind: ein Archiv mit zehntausend Einträgen, JSON, das tiefer verschachtelt ist, als die meisten Parser standardmäßig erlauben, und ein verschlüsseltes Archiv. Nichts davon ist ein Angriff – es sind die Formen, bei denen einer naiven Implementierung irgendetwas ausgeht.
| Datei | Was sie testet | Größe | Holen |
|---|---|---|---|
many-entries-10000.zip | Zehntausend kleine Einträge, unkomprimiert insgesamt unter 1 MB. Testet das Parsen des zentralen Verzeichnisses und den Aufwand pro Eintrag. Absichtlich keine ZIP-Bombe. | 1.6 MB | Herunterladen |
deeply-nested.json | 512 Verschachtelungsebenen. Gültiges JSON, aber tiefer, als viele Parser standardmäßig erlauben, und tief genug, um den Stack eines rekursiven Parsers zu sprengen. | 3 KB | Herunterladen |
encrypted-password-test.zip | Mit ZipCrypto verschlüsselt; das Passwort ist test. Entpacken ohne Passwort muss sauber scheitern, statt Datenmüll zu erzeugen. | 292 B | Herunterladen |
Formel-Injection in Tabellen
Eine CSV-Zelle, die mit =, +, - oder @ beginnt, wird beim Öffnen in Excel, Google Sheets oder LibreOffice als Formel interpretiert. Exportiert deine Anwendung von Nutzern eingegebenen Text nach CSV, ohne diese Präfixe zu maskieren, lieferst du deren Eingaben als ausführbare Formeln aus. Die Payloads hier berechnen harmlose Arithmetik.
| Datei | Was sie testet | Größe | Holen |
|---|---|---|---|
formula-injection.csv | Zellen, die mit =, +, - und @ beginnen und die Tabellenkalkulationen als Formeln behandeln. Die Payloads berechnen harmlose Arithmetik, und einer baut einen Link zu dieser Website. Nichts führt einen Befehl aus. | 189 B | Herunterladen |
3D-Modelle: leere, kaputte und irreführende Meshes
Mesh-Code geht gern von einem geschlossenen, sinnvoll großen, richtig orientierten Modell mit mindestens einem Dreieck aus. Nutzer laden alles andere hoch. Abgedeckt sind das leere Mesh, Dreiecke ohne Fläche und umgedrehte Dreiecke, ein nicht-mannigfaltiges Mesh, Koordinaten, die für float32 zu groß oder zu klein sind, eine mitten im Upload abgeschnittene GLB-Datei, eine STL mit lügendem Header, eine GLB-Datei, die sich als STL ausgibt, und die binäre STL, die an der klassischen Prüfung „beginnt mit solid, also ASCII“ scheitert. Sie liegen im 3D-Ordner; die gültigen 3D-Beispiele findest du in der Kategorie 3D-Modelle.
| Datei | Was sie testet | Größe | Holen |
|---|---|---|---|
empty-mesh-zero-triangles.stl | Eine strukturell gültige binäre STL: der 80-Byte-Header und eine Dreieckszahl von 0, sonst nichts (84 Byte). Code für Bounding Box, Zentrierung und Vorschaubilder teilt hier oft durch null oder greift auf ein leeres Array zu. | 84 B | Herunterladen |
empty-scene-no-meshes.glb | Ein gültiges binäres glTF 2.0 mit einer Szene und einem leeren Node, aber ohne Meshes, Buffer oder Materialien. Es besteht den Khronos-Validator. Viewer sollten eine leere Szene zeigen, statt einen Fehler zu werfen. | 276 B | Herunterladen |
degenerate-triangles.stl | Ein 10-mm-Würfel plus sechs Dreiecke ohne Fläche: wiederholte Vertices, kollineare Punkte und ein Splitter unterhalb von Epsilon. Die Normalenberechnung teilt hier durch eine Länge von null – daher kommen NaN-Normalen. | 984 B | Herunterladen |
flipped-normals-inside-out.stl | Ein 10-mm-Würfel, bei dem jedes Dreieck im Uhrzeigersinn orientiert ist und die gespeicherten Normalen nach innen zeigen. Mit Backface-Culling wird er schwarz oder unsichtbar dargestellt, und sein vorzeichenbehaftetes Volumen ist negativ. | 684 B | Herunterladen |
non-manifold-open-box-and-fins.stl | Eine Box ohne Deckel (ein offener Rand) plus zwei Finnen, die sich jeweils eine Kante mit zwei anderen Flächen teilen. So nicht druckbar; Slicer und Reparatur-Tools sollten beide Probleme melden. | 684 B | Herunterladen |
huge-coordinates-1e7.stl | Ein Würfel mit 100 Einheiten Kantenlänge, zehn Millionen Einheiten vom Ursprung entfernt. Bei dieser Größenordnung kann float32 nur ganze Zahlen darstellen, es zeigen sich also Probleme mit Präzision, Far-Plane der Kamera und automatischer Bildeinpassung. | 684 B | Herunterladen |
tiny-scale-1e-6.stl | Ein Würfel mit einem Millionstel Einheit Kantenlänge. In Millimetern gelesen ist er einen Mikrometer groß: Er testet Prüfungen der Mindestgröße, das Erraten von Einheiten und jedes Epsilon, mit dem Vertices zusammengeführt werden. | 684 B | Herunterladen |
extreme-float-values.stl | Vertex-Koordinaten bei ±3,0e38, nahe dem Maximum von float32, und ein Dreieck aus subnormalen Werten von 1e-40. Die Datei enthält weder NaN noch Infinity, aber die Berechnung der Bounding-Box-Größe in float32 läuft auf Infinity über. | 234 B | Herunterladen |
truncated.glb | Die ersten 60 Prozent einer gültigen texturierten GLB-Datei. Der Header gibt weiterhin die volle Länge an, und der BIN-Chunk endet zu früh – so sieht ein abgebrochener Upload einer GLB-Datei aus. | 80 KB | Herunterladen |
wrong-triangle-count-header.stl | Eine binäre STL, deren uint32-Zähler 1.000 Dreiecke angibt, während die Datei 12 enthält. Ein Reader, der dem Zähler vertraut, liest über das Ende hinaus; ein strenger lehnt die Datei ab, weil 84 + 50 × 1.000 nicht ihrer Größe entspricht. | 684 B | Herunterladen |
actually-a-glb.stl | Eine echte, gültige GLB-Datei (sie beginnt mit den Bytes glTF), gespeichert mit der Endung .stl. Alles, was anhand der Endung verteilt, gibt sie an den STL-Parser. | 21 KB | Herunterladen |
binary-stl-header-starts-with-solid.stl | Eine gültige binäre STL, deren Freitext-Header mit dem Wort solid beginnt, wie es mehrere echte Exporter schreiben. Wer ASCII-STL an diesem Präfix erkennt, schickt diese Datei an den falschen Parser; vergleiche stattdessen die Größe mit der Dreieckszahl. | 684 B | Herunterladen |
obj-missing-mtl.obj | Eine ansonsten gültige OBJ-Datei, deren mtllib-Zeile eine nicht existierende Materialdatei nennt. Die Geometrie sollte trotzdem mit einem Standardmaterial und einer Warnung laden, statt zu scheitern. | 914 B | Herunterladen |
obj-negative-indices.obj | Eine gültige OBJ-Datei, deren Flächen negative, relative Indizes verwenden (f -3 -2 -1), was das Format erlaubt. Viele selbst geschriebene Parser unterstützen nur positive Indizes. | 675 B | Herunterladen |
立方体 cube-modèle-🧊.stl | Ein gültiger 10-mm-Würfel, dessen Dateiname chinesische Zeichen, einen Buchstaben mit Akzent, ein Leerzeichen und ein Emoji mischt. Testet Content-Disposition, URL-Kodierung und Speicherschlüssel bei Modell-Uploads. | 684 B | Herunterladen |
Eine kurze Checkliste für den Umgang mit Uploads
- Prüfe eine Mindestgröße, nicht nur eine Maximalgröße. Uploads mit null Byte sind der am häufigsten übersehene Fall.
- Bestimme den Typ anhand der Bytes, nie anhand der Endung oder des vom Browser gemeldeten Content-Type. Beides kontrolliert der Angreifer.
- Liefere Nutzer-Uploads von einer separaten Domain aus oder mit
Content-Disposition: attachmentundX-Content-Type-Options: nosniff, damit eine Datei, die sich als HTML entpuppt, nicht in deinem Origin ausgeführt werden kann. - Entferne EXIF-Daten, bevor du ein Bild veröffentlichst, und wende vorher das Orientierungs-Tag an.
- Maskiere führende
=,+,-und@, wenn du Nutzertext in eine CSV schreibst. - Setze explizite Grenzen für die Anzahl der Archiveinträge, die entpackte Gesamtgröße und die Rekursionstiefe des Parsers, und gib eine klare Fehlermeldung aus, wenn eine davon erreicht wird.
- Lege fest, was mit einer nur teilweise hochgeladenen Datei passieren soll, und teste es dann mit den abgeschnittenen Dateien hier, statt es einfach anzunehmen.
Häufige Fragen
Sind diese Dateien gefährlich?
Nein. Es gibt keine Zip-Bomben, keine Path-Traversal-Einträge, keine ausführbaren Dateien, keine Makros und keine Malware-Teststrings. Die größte Datei entpackt sich auf unter ein Megabyte. Die Fehlerbilder sind echt – ein abgeschnittenes Bild ist wirklich abgeschnitten –, aber nichts hier greift den Rechner an, der es öffnet. Die Formel-Payloads in der Tabelle rechnen harmlose Arithmetik, statt einen Befehl auszuführen.
Wozu dient die HTML-Datei mit der Endung .jpg?
Sie ist die wertvollste Datei im ganzen Paket. Wenn deine Anwendung sie als Bild akzeptiert, speichert und später mit einem aus dem Inhalt erratenen Content-Type wieder ausliefert, rendert ein Browser sie als Seite auf deiner Domain. Das ist gespeichertes Cross-Site-Scripting über einen Bild-Upload. Die Datei anzunehmen ist in Ordnung; sie als HTML wieder auszuliefern nicht.
Warum beginnen Zellen in der CSV mit einem Gleichheitszeichen?
Weil Excel, Google Sheets und LibreOffice eine Zelle, die mit =, +, - oder @ beginnt, als Formel interpretieren. Exportiert deine Anwendung von Nutzern eingegebenen Text ohne Maskierung dieser Präfixe in eine CSV, landet alles, was jemand in ein Formular getippt hat, als aktive Formel in der Tabelle eines Kollegen. Die Lösung: Solchen Zellen beim Export einen Apostroph voranstellen oder sie in Anführungszeichen setzen.
Enthält das Foto wirklich GPS-Koordinaten?
Ja – den CN Tower in Toronto, 43,6426° Nord und 79,3871° West, dazu eine Höhenangabe. Außerdem trägt es Orientation 6, das heißt, ein Viewer sollte es um 90 Grad im Uhrzeigersinn drehen, um es aufrecht anzuzeigen. Zusammen decken sie die zwei Dinge ab, die jede Bild-Pipeline richtig machen muss: Standortdaten vor dem Veröffentlichen entfernen und die Drehung beachten, damit Hochformate nicht seitlich liegen.
Kann ich diese Dateien in einer automatisierten Testsuite verwenden?
Ja, genau dafür sind sie da. Jede Datei ist deterministisch, ihr SHA-256 ist hier veröffentlicht, und die Direktlinks haben lange Cache-Laufzeiten und offene CORS-Header. Schreib den Hash in deinem Test fest, und du merkst sofort, wenn sich eine Fixture jemals ändert.
Ein Problem gefunden oder etwas, das besser sein könnte? Wir lesen jede Nachricht und beheben Fehler schnell.
Brauchst du stattdessen gültige Dateien?
Meistens braucht man zum Testen eine Datei, die funktioniert. Die gibt es bei uns auch – echte Bilder, Videos, Audio, Dokumente, Archive, Daten, Schriften und 3D-Modelle, in exakten Größen mit veröffentlichten Hashes.