据我了解,状态为存档加密,包含通用位标志。我尝试使用 ZipArchive::statname() 进行检查,但似乎无法通过此方法获取信息。
我还能做什么?阅读存档并解析标题?我知道我可以调用 system(),但我不想使用这个方法,因为它的特殊性(一些托管这个函数被禁用)。
据我了解,状态为存档加密,包含通用位标志。我尝试使用 ZipArchive::statname() 进行检查,但似乎无法通过此方法获取信息。
我还能做什么?阅读存档并解析标题?我知道我可以调用 system(),但我不想使用这个方法,因为它的特殊性(一些托管这个函数被禁用)。
ZIP 文件头:(加密文件与普通文件)
09
似乎是加密标志。
检查第 7 个字节是0x09
function zip_is_encrypted($filename) {
$handle = fopen($filename, "rb");
$contents = fread($handle, 7);
fclose($handle);
return $contents[6] == 0x09;
}
这是 ZIP 标准:http ://www.pkware.com/documents/casestudies/APPNOTE.TXT 。
从第 4.3.7 节开始:
4.3.7 Local file header:
local file header signature 4 bytes (0x04034b50)
version needed to extract 2 bytes
general purpose bit flag 2 bytes
compression method 2 bytes
...
从第 4.4.4 节开始:
4.4.4 general purpose bit flag: (2 bytes)
Bit 0: If set, indicates that the file is encrypted.
...
所以你需要检查第七个字节的 FIRST BIT 而不是整个字节。您必须检查每个文件,因为每个文件都可以单独加密(第 4.3.6 节)。
那是行不通的,因为 Header 可以重复 n 次。
要解决此问题,请打开 zip zip_open() 并尝试读取每个条目 zip_entry_open()
如果有不可读的条目,则 zip 可能会被加密!