2012-08-22 68 views
0

据我了解,加密状态包含在通用位标志中。我试着用ZipArchive :: statname()来检查它,但似乎无法通过此方法获取信息。如何检查PHP中的加密Zip存档?

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

+0

你用ZipArchive :: statname试过了什么?你有错误信息吗?请给我们更多的信息。 – Frog

+0

ZipArchive打开加密文件,但提供的信息不够。方法'ZipArchive :: statIndex()'的返回值[示例](http://pastebin.com/ZetmVLKa)。我试图通过'comp_method'来识别加密的档案,但没有发现依赖关系。 – Ticksy

+1

Ticksy我甚至为你 – Peter

回答

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. 
    ... 

所以你需要检查第七字节第一位的,而不是整个字节。您必须对每个文件进行检查,因为每个文件都可以单独进行加密(第4.3.6节)。

+0

不错,我一直懒得学习文档 – Peter

5

ZIP文件头:(加密文件与正常文件)

enter image description here

09 seemts是加密标志。

检查第7个字节为0x09

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

+1做出简单的函数来一些正式文件指定位的引用将是不错 –

+1

@owlstead [标准](http://www.pkware.com/documents/casestudies/APPNOTE.TXT)。关于加密: '4.4.4通用位标志:(2个字节) 位0:如果设置,表明@owlstead您需要检查第七字节第一位的文件被encrypted.' –

+1

。 –