엣지 케이스 테스트 파일 — 손상, 잘림, 빈 파일, 잘못된 이름
파일 36개 · 직접 링크 · 광고 없음 · 자유롭게 사용
이 라이브러리의 다른 파일들은 "정상적인 PNG를 주세요"라는 요청에 답합니다. 이 페이지는 더 어려운 질문에 답합니다. 잘렸거나, 비어 있거나, 이름이 잘못되었거나, 유형을 속이거나, 들어 있으면 안 되는 데이터를 담은 파일을 코드가 어떻게 처리할까요? 실제 운영 환경에 들어오는 업로드가 바로 이런 파일이지만, 직접 만들기가 번거로워서 대부분의 테스트 스위트는 아예 시도하지 않습니다.
여기 있는 파일은 모두 안전합니다. ZIP 폭탄, 경로 탐색 항목, 실행 파일, 악성 코드 테스트 문자열은 없으며, 가장 큰 압축 파일도 풀면 1MB 미만입니다. 실패 방식은 진짜지만 내용물은 위험하지 않으며, 파일마다 SHA-256이 공개되어 있어 테스트 픽스처로 고정할 수 있습니다.
.jpg라는 이름의 HTML 파일은 이미지 업로드가 내 도메인에서 저장형 크로스 사이트 스크립팅(XSS)으로 이어질 수 있는지 알려 줍니다. 수식 페이로드가 든 CSV는 내보낸 데이터가 동료의 스프레드시트에서 실제로 동작하는 수식으로 열리는지 알려 줍니다. 실제 버그를 가장 자주 찾아내는 것이 이 두 파일입니다.빈 파일과 거의 빈 파일
0바이트 업로드는 가장 흔히 잊는 경우입니다. 최대 크기를 확인하는 검증기도 최소 크기는 잊기 쉽고, 길이를 확인하기 전에 첫 바이트를 읽는 코드는 깔끔한 오류를 반환하는 대신 여기서 충돌합니다.
잘리거나 손상된 파일
헤더는 유효하지만 데이터가 불완전하거나 손상된 파일로, 업로드가 중단되면 실제로 이런 모습이 됩니다. 헤더를 믿고 나머지를 스트리밍하는 코드는 여기서 실패하며, 어디서 실패하는지를 보면 오류 처리가 생각한 위치에 있는지 알 수 있습니다.
| 파일 | 테스트 항목 | 크기 | 받기 |
|---|---|---|---|
truncated.png | PNG 시그니처와 IHDR은 유효하지만 이미지 데이터 중간에서 잘렸습니다. 디코더는 일부만 담긴 이미지를 반환하지 않고 오류를 냅니다. | 4 KB | 다운로드 |
corrupt-crc.png | 길이와 구조는 정상이지만 이미지 데이터 안의 바이트 하나가 뒤집혀 저장된 CRC와 더 이상 일치하지 않습니다. 엄격한 디코더는 거부하고, 관대한 디코더는 잘못된 픽셀을 반환합니다. | 9 KB | 다운로드 |
truncated.jpg | 60% 지점에서 잘려 이미지 끝 마커가 없는 JPEG입니다. 많은 디코더가 실패하지 않고 일부만 디코딩된 이미지를 반환하므로, 사용하는 디코더가 어떻게 동작하는지 알아 둘 만합니다. | 603 B | 다운로드 |
truncated.zip | 중앙 디렉터리가 잘려 있습니다. 압축 파일 업로드가 중간에 끊기면 이런 모습이 되며, 실제로 가장 흔한 손상 ZIP입니다. | 3 KB | 다운로드 |
malformed.json | 후행 쉼표, 따옴표 없는 키, 닫히지 않은 중괄호가 있습니다. 파서가 일반적인 실패 메시지 대신 쓸모 있는 오류 위치를 알려 주는지 테스트합니다. | 136 B | 다운로드 |
형식을 속이는 파일
확장자와 실제 바이트가 서로 다른 형식을 가리킵니다. 업로드 핸들러가 확장자나 브라우저가 보낸 Content-Type을 믿는다면 이 파일들이 통과합니다. 중요한 것은 .jpg라는 이름의 HTML 파일입니다. 이미지 콘텐츠 유형으로 다시 제공되면 무해하지만, 내 도메인에서 HTML로 제공되면 저장형 크로스 사이트 스크립팅(XSS)이 됩니다.
메타데이터와 개인정보
휴대폰에서 바로 가져온 사진에는 촬영 위치와 방향 정보가 담겨 있습니다. 위치를 제거하지 않으면 사용자의 위치가 유출되고, 방향을 무시하면 세로 사진이 모두 옆으로 누워 보입니다. 이 파일에는 둘 다 들어 있어 파이프라인이 각각을 제대로 처리하는지 확인할 수 있습니다.
| 파일 | 테스트 항목 | 크기 | 받기 |
|---|---|---|---|
exif-gps-orientation.jpg | GPS 좌표(토론토 CN 타워)와 Orientation 6(똑바로 보이려면 시계 방향으로 90도 회전)이 들어 있습니다. 위치 데이터를 제거하는지, 회전 정보를 반영하는지 둘 다 확인하는 데 쓰세요. | 1 KB | 다운로드 |
텍스트, 인코딩, 줄바꿈
첫 번째 열에 보이는 문자로 나타나는 바이트 순서 표시(BOM), 쉼표와 실제 줄바꿈이 들어간 따옴표 필드, 한 파일 안의 세 가지 줄 끝 문자, 마지막 줄 끝 문자 없음. 모두 실제 사용자가 보내는 파일에서 흔히 볼 수 있는 것들입니다.
| 파일 | 테스트 항목 | 크기 | 받기 |
|---|---|---|---|
bom-crlf-quoted.csv | UTF-8 바이트 순서 표시(BOM), CRLF 줄 끝, 쉼표가 들어간 따옴표 필드, 이스케이프된 큰따옴표, 필드 안의 실제 줄바꿈, ASCII가 아닌 이름이 들어 있습니다. 첫 번째 열 머리글에 BOM이 보인다면 그게 바로 버그입니다. | 180 B | 다운로드 |
unicode-torture.txt | 결합 문자, 폭 없는 공백, 오른쪽에서 왼쪽 재정의 문자, 아스트랄 평면 문자, 코드 포인트 6개로 된 국기 이모지가 들어 있습니다. 길이 계산, 자르기, 정규화를 테스트합니다. | 565 B | 다운로드 |
mixed-line-endings.txt | 한 파일에 LF, CRLF, 단독 CR이 섞여 있고 마지막 줄에는 줄 끝 문자가 없습니다. 줄 수를 세는 코드끼리 결과가 어긋나기 쉬운 경우입니다. | 107 B | 다운로드 |
no-trailing-newline.txt | 줄바꿈 없이 끝납니다. 확인하지 않고 이 파일에 이어 쓰면 두 레코드가 하나로 붙어 버립니다. | 48 B | 다운로드 |
까다로운 파일 이름
내용이 아니라 이름이 테스트 대상입니다. 긴 이름은 데이터베이스 열과 파일 시스템 한도를 넘고, ASCII가 아닌 이름은 Content-Disposition 헤더, URL 이스케이프, macOS에서 조합형과 분해형 유니코드의 차이 때문에 문제를 일으킵니다.
| 파일 | 테스트 항목 | 크기 | 받기 |
|---|---|---|---|
文件名-with spaces-🌲.txt | 파일 이름에 한자, 공백, 이모지가 들어 있습니다. Content-Disposition 인코딩, URL 이스케이프, macOS의 분해형 유니코드 정규화를 테스트합니다. | 194 B | 다운로드 |
구조 및 리소스 한도
손상된 것은 아니지만 다루기 까다로운 유효한 파일입니다. 항목이 1만 개인 압축 파일, 대부분의 파서 기본 허용치보다 깊이 중첩된 JSON, 암호화된 압축 파일이 있습니다. 공격용 파일은 아니며, 단순한 구현이 무언가를 소진하게 만드는 형태들입니다.
| 파일 | 테스트 항목 | 크기 | 받기 |
|---|---|---|---|
many-entries-10000.zip | 작은 항목 1만 개로, 압축을 풀어도 전체 1 MB 미만입니다. 중앙 디렉터리 파싱과 항목별 오버헤드를 테스트합니다. 의도적으로 압축 폭탄(zip bomb)이 아니게 만들었습니다. | 1.6 MB | 다운로드 |
deeply-nested.json | 512단계로 중첩되어 있습니다. 유효한 JSON이지만 많은 파서의 기본 허용치보다 깊고, 재귀 파서의 스택을 소진할 만큼 깊습니다. | 3 KB | 다운로드 |
encrypted-password-test.zip | ZipCrypto로 암호화되어 있으며 암호는 test입니다. 암호 없이 압축을 풀면 쓰레기 데이터를 만들지 않고 깔끔하게 실패해야 합니다. | 292 B | 다운로드 |
스프레드시트 수식 삽입
=, +, -, @로 시작하는 CSV 셀은 Excel, Google Sheets, LibreOffice에서 파일을 열 때 수식으로 해석됩니다. 애플리케이션이 사용자가 입력한 텍스트를 이런 접두사를 이스케이프하지 않고 CSV로 내보낸다면, 사용자의 입력을 실행 가능한 수식으로 배포하는 셈입니다. 여기 있는 페이로드는 무해한 산술 계산만 합니다.
| 파일 | 테스트 항목 | 크기 | 받기 |
|---|---|---|---|
formula-injection.csv | 스프레드시트 애플리케이션이 수식으로 처리하는 =, +, -, @로 시작하는 셀이 있습니다. 페이로드는 무해한 산술 계산만 하며, 하나는 이 사이트로 가는 링크를 만듭니다. 명령을 실행하는 것은 없습니다. | 189 B | 다운로드 |
3D 모델: 비어 있거나 손상되었거나 잘못된 정보를 담은 메시
메시 코드는 모델이 닫혀 있고, 크기가 적당하며, 감기 방향이 올바르고, 삼각형이 적어도 하나 있다고 가정하기 쉽습니다. 사용자는 그 밖의 모든 것을 업로드합니다. 여기에는 빈 메시, 면적이 0이거나 안팎이 뒤집힌 삼각형, 비매니폴드 메시, float32로 제대로 처리하기에는 너무 크거나 작은 좌표, 업로드 도중 잘린 GLB, 헤더 정보가 틀린 STL, STL인 척하는 GLB, 그리고 고전적인 “solid로 시작하면 ASCII” 검사에 걸리는 바이너리 STL이 있습니다. 이 파일들은 3D 폴더에 있으며, 유효한 3D 샘플은 3D 모델 카테고리에 있습니다.
| 파일 | 테스트 항목 | 크기 | 받기 |
|---|---|---|---|
empty-mesh-zero-triangles.stl | 구조상 유효한 바이너리 STL로, 80바이트 헤더와 삼각형 수 0만 있고 그 외에는 아무것도 없습니다(84바이트). 경계 상자, 중앙 정렬, 썸네일 코드가 여기서 0으로 나누거나 빈 배열을 인덱싱하는 경우가 많습니다. | 84 B | 다운로드 |
empty-scene-no-meshes.glb | 장면 하나와 빈 노드 하나는 있지만 메시, 버퍼, 재질은 없는 유효한 glTF 2.0 바이너리입니다. Khronos 검사기를 통과합니다. 뷰어는 예외를 던지지 말고 빈 장면을 보여 줘야 합니다. | 276 B | 다운로드 |
degenerate-triangles.stl | 10 mm 정육면체에 면적이 0인 삼각형 6개(중복 정점, 일직선 위의 점, 엡실론보다 얇은 조각)를 더했습니다. 여기서 법선 계산이 길이 0으로 나누게 되며, NaN 법선은 바로 이렇게 생깁니다. | 984 B | 다운로드 |
flipped-normals-inside-out.stl | 모든 삼각형이 시계 방향으로 감겨 있고 저장된 법선이 안쪽을 향하는 10 mm 정육면체입니다. 후면 컬링을 켜면 검게 보이거나 보이지 않으며, 부호 있는 부피는 음수입니다. | 684 B | 다운로드 |
non-manifold-open-box-and-fins.stl | 윗면이 없는 상자(열린 경계)에 다른 두 면과 각각 모서리를 공유하는 지느러미 두 개를 더했습니다. 이대로는 출력할 수 없으며, 슬라이서와 복구 도구가 두 문제를 모두 표시해야 합니다. | 684 B | 다운로드 |
huge-coordinates-1e7.stl | 원점에서 1천만 단위 떨어진 곳에 중심이 있는 100단위 정육면체입니다. 이 크기에서는 float32가 정수만 표현할 수 있어 정밀도, 카메라 원거리 평면, 자동 화면 맞춤 문제가 모두 드러납니다. | 684 B | 다운로드 |
tiny-scale-1e-6.stl | 한 변이 100만분의 1단위인 정육면체입니다. 밀리미터로 읽으면 1마이크로미터로, 최소 크기 검사, 단위 추측, 정점 병합에 쓰는 엡실론을 테스트합니다. | 684 B | 다운로드 |
extreme-float-values.stl | 정점 좌표가 float32 최댓값에 가까운 ±3.0e38이고, 비정규 값 1e-40으로 이루어진 삼각형이 하나 있습니다. 파일에 NaN이나 Infinity는 없지만, float32로 경계 상자 크기를 계산하면 Infinity로 오버플로됩니다. | 234 B | 다운로드 |
truncated.glb | 텍스처가 있는 유효한 GLB의 앞 60%입니다. 헤더는 여전히 전체 길이를 주장하고 BIN 청크는 일찍 끝나므로, GLB 업로드가 중단되면 이런 모습이 됩니다. | 80 KB | 다운로드 |
wrong-triangle-count-header.stl | uint32 개수 필드는 삼각형 1,000개라고 하지만 실제로는 12개만 담긴 바이너리 STL입니다. 개수를 믿는 리더는 파일 끝을 넘어 읽고, 엄격한 리더는 84 + 50 × 1,000이 파일 크기와 같지 않으므로 파일을 거부합니다. | 684 B | 다운로드 |
actually-a-glb.stl | .stl 확장자로 저장된 진짜 유효한 GLB입니다(바이트 glTF로 시작). 확장자로 처리 방식을 정하는 코드는 이 파일을 STL 파서에 넘깁니다. | 21 KB | 다운로드 |
binary-stl-header-starts-with-solid.stl | 자유 텍스트 헤더가 solid라는 단어로 시작하는 유효한 바이너리 STL로, 실제로 여러 내보내기 도구가 이렇게 씁니다. 이 접두사로 ASCII STL을 판별하면 이 파일이 엉뚱한 파서로 갑니다. 대신 파일 크기를 삼각형 수와 비교하세요. | 684 B | 다운로드 |
obj-missing-mtl.obj | mtllib 줄이 존재하지 않는 재질 파일을 가리키는 것 외에는 유효한 OBJ입니다. 실패하지 말고 기본 재질과 경고와 함께 지오메트리를 불러와야 합니다. | 914 B | 다운로드 |
obj-negative-indices.obj | 면에 음수 상대 인덱스(f -3 -2 -1)를 쓰는 유효한 OBJ로, 형식상 허용됩니다. 직접 작성한 파서는 양수 인덱스만 지원하는 경우가 많습니다. | 675 B | 다운로드 |
立方体 cube-modèle-🧊.stl | 파일 이름에 한자, 악센트 문자, 공백, 이모지가 섞인 유효한 10 mm 정육면체입니다. 모델 업로드의 Content-Disposition, URL 인코딩, 스토리지 키를 테스트합니다. | 684 B | 다운로드 |
업로드 처리를 위한 간단한 체크리스트
- 최대 크기뿐 아니라 최소 크기도 확인하세요. 0바이트 업로드는 가장 흔히 놓치는 경우입니다.
- 파일 유형은 확장자나 브라우저가 보낸 콘텐츠 유형이 아니라 바이트 내용으로 판단하세요. 둘 다 공격자가 조작할 수 있습니다.
- 사용자 업로드 파일은 별도 도메인에서 제공하거나
Content-Disposition: attachment와X-Content-Type-Options: nosniff를 붙여 제공해, HTML로 밝혀진 파일이 내 출처(origin)에서 실행되지 않도록 하세요. - 이미지를 게시하기 전에 EXIF를 제거하고, 제거하기 전에 방향 태그를 먼저 적용하세요.
- 사용자 텍스트를 CSV에 쓸 때는 맨 앞의
=,+,-,@을 이스케이프하세요. - 압축 파일의 항목 수, 압축 해제 후 전체 크기, 파서 재귀 깊이에 명시적인 제한을 두고, 제한에 걸리면 명확한 오류를 반환하세요.
- 일부만 업로드된 파일을 어떻게 처리할지 정한 다음, 추측하지 말고 여기 있는 잘린 파일로 테스트하세요.
자주 묻는 질문
이 파일들은 위험하지 않나요?
위험하지 않습니다. ZIP 폭탄, 경로 탐색 항목, 실행 파일, 매크로, 악성 코드 테스트 문자열이 없습니다. 가장 큰 파일도 풀면 1MB 미만입니다. 실패 방식은 진짜라서 잘린 이미지는 실제로 잘려 있지만, 파일을 여는 컴퓨터를 공격하는 것은 없습니다. 스프레드시트 수식 페이로드도 명령을 실행하지 않고 무해한 계산만 합니다.
.jpg 확장자가 붙은 HTML 파일은 무엇에 쓰나요?
이 팩에서 가장 가치 있는 파일입니다. 애플리케이션이 이 파일을 이미지로 받아 저장한 뒤, 나중에 내용으로 추측한 콘텐츠 유형으로 다시 제공하면 브라우저는 이를 내 도메인의 페이지로 렌더링합니다. 이미지 업로드를 통한 저장형 크로스 사이트 스크립팅입니다. 파일을 받아들이는 것은 괜찮지만, HTML로 다시 제공하는 것은 안 됩니다.
CSV에 등호로 시작하는 셀이 있는 이유는 무엇인가요?
Excel, Google Sheets, LibreOffice는 =, +, -, @로 시작하는 셀을 수식으로 해석하기 때문입니다. 애플리케이션이 사용자가 입력한 텍스트를 이 접두사를 이스케이프하지 않고 CSV로 내보내면, 사용자가 양식에 입력한 내용이 동료의 스프레드시트에서 실제 수식으로 동작합니다. 내보낼 때 이런 셀 앞에 아포스트로피를 붙이거나 따옴표로 감싸면 해결됩니다.
사진에 정말 GPS 좌표가 들어 있나요?
네. 토론토의 CN 타워, 북위 43.6426도·서경 79.3871도 좌표와 고도가 들어 있습니다. 또한 Orientation 6 값이 있어, 뷰어가 이미지를 시계 방향으로 90도 회전해야 똑바로 표시됩니다. 이 두 가지로 모든 이미지 파이프라인이 제대로 처리해야 하는 두 가지를 확인할 수 있습니다. 게시 전에 위치 데이터를 제거하는 것, 그리고 세로 사진이 옆으로 눕지 않도록 회전 정보를 반영하는 것입니다.
자동화된 테스트 스위트에서 사용할 수 있나요?
네, 바로 그 용도로 만들었습니다. 모든 파일은 결정적으로 생성되고 SHA-256이 이 페이지에 공개되어 있으며, 직접 링크는 캐시 유효 기간이 길고 CORS가 열려 있습니다. 테스트에 해시를 고정해 두면 픽스처가 바뀌는 즉시 알 수 있습니다.
문제를 발견하셨거나 개선할 점이 있나요? 모든 메시지를 읽고 빠르게 고칩니다.
정상 파일이 필요하세요?
대부분의 테스트에는 정상 작동하는 파일이 필요합니다. 그런 파일도 제공합니다. 실제 이미지, 동영상, 오디오, 문서, 압축 파일, 데이터, 글꼴, 3D 모델을 정확한 크기와 공개된 해시로 받을 수 있습니다.