如何检查PHP中的加密Zip存档?

时间:2012-08-22 21:42:51

标签: php encryption zip zipfile ziparchive

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

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

3 个答案:

答案 0 :(得分:5)

ZIP文件标题:(加密文件与普通文件)

enter image description here

09似乎是加密标志。

检查第7个字节是0x09

function zip_is_encrypted($filename) {
  $handle = fopen($filename, "rb");
  $contents = fread($handle, 7);
  fclose($handle);
  return $contents[6] == 0x09;
}

答案 1 :(得分: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节)。

答案 2 :(得分:0)

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

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

如果存在不可读的条目,则说明该zip可能已加密!