跳到内容

💔 损坏的文件

为错误处理验证而故意损坏的文件。请用于验证和错误处理测试。

文件头损坏的 PNG 文件

文件头损坏的 PNG 文件

PNG / 10 KB

中途被截断的 PNG 文件

中途被截断的 PNG 文件

PNG / 30 B

文件头损坏的 PDF 文件

文件头损坏的 PDF 文件

PDF / 10 KB

中途被截断的 PDF 文件

中途被截断的 PDF 文件

PDF / 40 B

已损坏的 ZIP 文件

已损坏的 ZIP 文件

ZIP / 10 KB

含语法错误的 JSON 文件

含语法错误的 JSON 文件

JSON / 36 B

各行列数不一致的 CSV 文件

各行列数不一致的 CSV 文件

CSV / 231 B

为什么测试损坏文件很重要

在生产环境中,网络故障或传输错误可能导致文件损坏。恶意用户也可能上传伪造扩展名的文件。

使用这些损坏文件测试您的应用是否能正确检测和处理错误。不崩溃并返回清晰错误消息至关重要。

📖 常见的坑

这些是故意损坏的文件:中途截断的、仅头部损坏的、语法非法的、列数不一致的。它们检验的是错误处理,而不是安全性。这里的是事故造成的损坏形态,与攻击者精心构造的文件是两回事。

情形 会发生什么 怎么处理
抛了异常,用户却什么也没看到 一个笼统的 try / catch 把它吞掉,只返回空结果或裸 500。日志里往往也只写了「失败了」。 哪个文件、第几行、发生了什么返回给用户。实际把损坏文件投进去看看界面,以「用户能否据此采取下一步」来判断。
被截断的文件通过了大小检查 只要小于上限就能通过。没人看另一端,于是 0 字节或几十字节的文件也照样被保存。 同时设置下限。再检查各格式的结尾标记:PDF 应以 %%EOF 结束,ZIP 应有 End of Central Directory(50 4B 05 06),缺失即可判定被截断。
只看头部就相信了内容 魔术字节正确,并不代表后面没坏。这里的 header-corrupted 文件正相反:内容可读,只有开头不对 不仅在入口校验,在真正读取的环节也要校验。图片就真正解码一次,ZIP 就实际列一次目录,最为可靠。
列数不一致的 CSV 悄悄通过了 多数 CSV 解析器只是按行返回数组,并不检查列数是否一致。缺失的列变成 null 后照样入库。 以表头行的列数为基准,逐行比对并带上行号拒绝。若问题出在分隔符或引号,先用 CSV 清理工具整理后再读取更快。

这里模拟的是事故性损坏。刻意构造的攻击输入 —— ZIP 炸弹、极深嵌套的 XML、解压后体积巨大的压缩包 —— 并不包含在内,那些需要在解压前用大小与深度上限拦住。