我使用内置的ZipFile
和testzip()
方法来验证某些用户提供的zip文件是否有效。
不幸的是,ZipFile似乎应用了额外的启发式,因为它接受例如不直接以ZIP头PKx03x04
开始的ZIP文件。相反,它似乎在整个文件中搜索这个不需要的头文件,因此也接受以二进制"垃圾"开头的ZIP文件。
有没有办法在某种程度上"严格"地改变ZipFile
?模式,它只接受纯100%有效的ZIP文件?
环境:Python 3.6(在Ubuntu 18.04上)
testzip函数只是测试存档中的所有文件是否有一个有效的checkum。
许多检查只在open方法中完成,当实际打开一个zip条目时(而不是在打开zip文件时)。
我不知道一个"严格的";模式,但是我有一个想法:您也可以认为不包含条目的zip文件无效,或者任何无法打开的条目。我打赌,将一个文件错误解释为一个具有有效校验和和可打开文件的条目的zipfile的可能性比将一个文件错误解释为一个zipfile的可能性要小得多。
最后,我添加了Python ZipFile实现中实际上缺失的检查:文件必须以ZIP文件头magic bytes开始:
# 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'PKx03x04':
raise BadZipFile()