Python ZipFile.testzip() 接受无效的 ZIP 文件

Python ZipFile.testzip() accepts invalid ZIP files

我正在使用 built-in ZipFiletestzip() 方法来验证某些用户提供的 zip 文件是否有效。

不幸的是,ZipFile 似乎应用了额外的启发式方法,因为它接受例如不直接以 Zip header PK\x03\x04 开头的 ZIP 文件。相反,它似乎在整个文件中搜索不需要的 header,因此也接受以二进制“垃圾”开头并附加 ZIP 存档的 ZIP 文件。

有没有办法改变 ZipFile 某种“严格”模式,它只接受普通的 100% 有效 ZIP 文件?

环境:Python 3.6(在 Ubuntu 18.04 上)

testzip function 只是测试存档中的所有文件是否都具有有效的校验码。

许多检查仅在 open 方法中完成,在实际打开 zip 条目时(而不是在打开 zip 文件时)。

我不知道“严格”模式,但我有一个想法:您也可以将不包含任何条目或任何无法打开的条目的 zip 文件视为无效。打赌将文件错误解释为具有有效校验和和可打开文件条目的 zipfile 的可能性比将文件错误解释为 zipfile 的可能性要小得多。

最后我只是添加了 Python ZipFile 实现中实际缺失的检查:文件必须以 ZIP 文件头魔术字节开头:

# test if the file has at least some bytes        
if file_size < 10:
    raise BadZipFile() # file is too small to be a valid ZIP file

with open(uploaded_file, "rb") as f:
    header = f.read(4)
    if not header == b'PK\x03\x04':
        raise BadZipFile()