如何在PHP中检查加密的Zip存档文件?
据我所知,状态为存档加密,包含通用位标志。我试图用ZipArchive::statname()检查这一点,但似乎无法通过此方法获取信息 我还能做什么?读取归档文件并解析标题?我知道我可以调用system(),但我不想使用此方法,因为它的特殊性(承载此函数的某些函数已被禁用)。ZIP文件头:(加密文件与普通文件)如何在PHP中检查加密的Zip存档文件?,php,encryption,zip,zipfile,ziparchive,Php,Encryption,Zip,Zipfile,Ziparchive,据我所知,状态为存档加密,包含通用位标志。我试图用ZipArchive::statname()检查这一点,但似乎无法通过此方法获取信息 我还能做什么?读取归档文件并解析标题?我知道我可以调用system(),但我不想使用此方法,因为它的特殊性(承载此函数的某些函数已被禁用)。ZIP文件头:(加密文件与普通文件) 09请参见MTS作为加密标志 检查第7字节是否为0x09 function zip_is_encrypted($filename) { $handle = fopen($filen
09
请参见MTS作为加密标志
检查第7字节是否为0x09
function zip_is_encrypted($filename) {
$handle = fopen($filename, "rb");
$contents = fread($handle, 7);
fclose($handle);
return $contents[6] == 0x09;
}
以下是ZIP标准:
根据第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节)。这不起作用,因为标头可以重复n次 要解决此问题,请打开zip-zip\u-open()并尝试读取每个条目zip\u-entry\u-open()
如果存在无法读取的条目,则可以对zip进行加密 你用ZipArchive::statname做了哪些尝试?你收到错误信息了吗?请提供更多信息。ZipArchive打开了加密文件,但提供的信息不足。方法
ZipArchive::statidex()
的返回值的一个参数。我试图通过comp_方法
识别加密档案,但没有发现任何依赖关系。Ticksy我甚至为您提供了一个简单的函数+1,引用了一些官方文件,指定了位nice@owlstead . 关于加密:4.4.4通用位标志:(2字节)位0:如果设置,则表示文件已加密。
@owlstead您需要检查第七字节的第一位。Peter answer不起作用。不同的zip应用程序在文件顶部放置不同的信息。例如,带有密码的izarc4.3zip文件的第7字节将有一个03值,如果没有密码保护,则有一个02值。