首页 > 解决方案 > 如何修复节点中注释长度无效的无效 zip 文件(供 yauzl 等严格库使用)

问题描述

根据this issue (#48) with the node library yauzl,并讨论here,zip规范存在缺陷,很容易创建无效的zip文件。

.zip 文件的高级结构规定读者必须首先查找位于 .zip 文件末尾的中央目录记录的结尾。中央目录记录结束的最后一个字段是可变长度的注释。评论的长度记录在中央目录记录末尾的一个字段中,位于评论本身之前。...从字面上看,找到中央目录记录结尾的唯一方法是使用启发式方法来猜测 zipfile 创建者的意图。.zip 文件规范不明确;这是有缺陷的。

yauzl 向后搜索幻数,一旦找到,yauzl 会进行一些额外的检查,以确保这个幻数实际上是中央目录记录结尾的一部分。此检查涉及对中央目录记录结尾中的所有字段的完整性检查,包括验证评论长度字段是否正确。如果任何字段看起来有问题,则该 zipfile 将被拒绝。

当前无效的 zip 文件在 yauzl(可能还有其他符合规范的库)中引发“无效的注释长度”错误。在该问题中提到了如何修复无效的 zip 文件:

...可以通过删除 zipfile 末尾的字节来对 zipfile 进行最后一分钟的修复。为此,从末尾向后搜索幻数(请参阅规范中提到的“中央文件头签名”),并删除中央目录记录末尾之后的所有内容。

但是没有关于如何实施该修复的示例。所以我的问题是:如果我们的文件缓冲区包含无效的 zip,其中包含无效长度的注释,我们将如何“从末尾向后搜索幻数,并删除中央末尾之后的所有内容目录记录”?

标签: node.jszipunzip

解决方案


推荐阅读