我正在使用内置的
ZipFile
和它的 testzip()
方法来验证某些用户提供的 zip 文件是否有效。
不幸的是,ZipFile 似乎应用了额外的启发式方法,因为它接受不直接以 Zip 标头开头的 ZIP 文件
PK\x03\x04
。相反,它似乎在整个文件中搜索这个不需要的标头,因此也接受以二进制“垃圾”开头并附加 ZIP 存档的 ZIP 文件。
有没有办法改变ZipFile
在某种“严格”模式下,它只接受普通的100%有效的ZIP文件?环境:Python 3.6(在 Ubuntu 18.04 上)
# 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()
PK\x03\x04
签名将不匹配。如果 zip 文件不包含任何文件,它也不匹配。