强制从 php 打开和读取 zip 文件

Posted

技术标签:

【中文标题】强制从 php 打开和读取 zip 文件【英文标题】:Force opening and reading zip files from php 【发布时间】:2011-02-15 18:37:40 【问题描述】:

这可能是一个简单的问题,也可能是一个相当复杂的问题,让你来做决定。

使用 php 打开一个 zip 文件,将文件解压到一个目录并关闭该 zip 文件并不是一个复杂的类。

但是可以说文件不是 zip,但可以被 WinRar 读取,这些文件的示例就像 exe 的 SFX 存档等。

所有这些文件都有哪些因素可以让WinRar浏览它们的来源。

另一个例子是防病毒软件,它单独扫描 EXE 中的文件?

举个例子:

$handle = fopen("an_unknown_file.abc", "rb");
while (!feof($handle))

    //What generic code could I use to determain weather the file can be extracted ?

fclose($handle);

问候。

【问题讨论】:

【参考方案1】:

Zip 的规范允许将实际的“zip”文件部分嵌入文件中的任何位置。它不一定必须从文件中的位置“0”开始。这就是自解压拉链的工作原理。这是一个小的 .exe 存根程序,其末尾附加了一个较大的 .zip 文件。

查找 zip 主要是在文件中扫描 zip 文件的“幻数”,然后进行一些启发式方法来确定它是否真的是 zip 文件,或者只是碰巧包含 zip 幻数的随机文件.

.docx 文件实际上只是一个 .zip,其中包含表示 Word 文件内容的各种 XML 文件。就像 .jar 是一个包含各种不同 Java 代码块的 zip 文件一样。

Winrar 中有一堆额外的代码来扫描文件并查找任何可识别的“这是一个压缩存档”类型签名,其中一个恰好是 zip 文件的签名。

没有什么太神奇的了。只需扫描文件并查找签名即可。

【讨论】:

绝妙的答案,这是我正在寻找的信息,您是否有任何链接指向我可以阅读的有关 Zip 的“幻数”的一些论文。谢谢 不是随便的,但我相信你可以很快在谷歌上找到一些东西。对于“基本”zip 文件,您可以查看任何 unix 系统的“魔术”文件,其中包含魔术数字和启发式方法来定位它。 神奇的数字是PK,我找到了发现隐藏在所有类型文件中的档案的方法,谢谢:) 只是想知道您不会错误地尝试提取列出 MMO 或其他内容中的 griefers 的文件。仅仅因为“PK”的出现并不意味着它是一个拉链......仍然需要做其他的启发式。【参考方案2】:

不确定您的问题到底是什么,但我认为您在这里混淆了一些东西......文件扩展名可以描述为人类和计算机将文件扩展名与工作文件/程序的类型相关联的便捷方式跟他们。 WinRar(或任何其他程序)读取文件包含的内容,如果它可以理解它 - 它可以使用它。唯一重要的是文件格式(文件中的数据)是有效的,并且您使用的程序可以使用这种文件格式。

所以,如果文件是 WinRar 可以使用的任何格式(.rar、.zip、.gz 等),它的扩展名可以是 .txt 或 .whatever,WinRar 仍然可以使用它.扩展只是为了方便。

【讨论】:

对不起,我了解扩展名和内容类型,我的问题是什么决定了归档文件与常规文件,取.docx文件,这是一个word文件,这不会有与.rar winrar 归档文件的结构相同,但必须有相似之处,因为 winrar 能够读取其中的内容文件。 嗯,.rar 和 .gz 也有很大的不同,但 WinRar 两者都可以使用。只是创建 WinRar(或任何其他程序)的人使它可以使用这种文件格式。 .docx 也是如此——编写 WinRar 的人编写它是为了能够“理解”.docx 格式。这真的没有“法律”。如果您可以让您的软件使用更多格式,如果它有意义(存档器播放 mp3 会很奇怪),如果它会被用户使用 - 去做吧。我对 .docx 了解不多, 但它不需要与 .rar 有任何共同之处,WinRar 就可以使用 WinRar 不是专门为与docx 一起工作而构建的,如下所述:rarlab.com/otherfmt.htm - 他们构建了某种通用阅读器,可以阻止文件是否包含元数据,并且能够一般读取该数据,这是我感兴趣的,需要采取的通用路线来理解文件的结构。 现在我明白你想知道的,但不能帮助你。我可能会给你一些寻找的方向,但我认为@Marc B's answer可以做到这一点。希望你能找到你要找的东西

以上是关于强制从 php 打开和读取 zip 文件的主要内容,如果未能解决你的问题,请参考以下文章

从 zip 打开文件而不用 Python 解压?

打开 zip 并阅读内容

无法打开受密码保护的 zip 存档

在 PHP 中打开并列出 zip 存档中的文件/文件夹

php基础系列之 数据的存储和读取

c语言调用libzip库读zip文件