0

据我了解,状态为存档加密,包含通用位标志。我尝试使用 ZipArchive::statname() 进行检查,但似乎无法通过此方法获取信息。

我还能做什么?阅读存档并解析标题?我知道我可以调用 system(),但我不想使用这个方法,因为它的特殊性(一些托管这个函数被禁用)。

4

3 回答 3

5

ZIP 文件头:(加密文件与普通文件)

在此处输入图像描述

09似乎是加密标志。

检查第 7 个字节是0x09

function zip_is_encrypted($filename) {
  $handle = fopen($filename, "rb");
  $contents = fread($handle, 7);
  fclose($handle);
  return $contents[6] == 0x09;
}
于 2012-08-22T21:53:47.717 回答
4

这是 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 节)。

于 2013-11-19T10:36:40.250 回答
0

那是行不通的,因为 Header 可以重复 n 次。

要解决此问题,请打开 zip zip_open() 并尝试读取每个条目 zip_entry_open()

如果有不可读的条目,则 zip 可能会被加密!

于 2020-11-24T09:29:00.380 回答