node.js - 如何修复节点中注释长度无效的无效 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,其中包含无效长度的注释,我们将如何“从末尾向后搜索幻数,并删除中央末尾之后的所有内容目录记录”?
解决方案
推荐阅读
- webpack - 在 webpack 配置中没有使用 HtmlWebpackPlugin 生成 index.html
- angular - Angular:如何使用 RXJS 6 调用 finally()
- windows - /Gh 和 /GH 导致我的应用程序无法启动
- java - 如何在 Java Spring API 中更改默认 Swagger 2 api 文档名称
- autodesk-forge - 如何在 Forge 查看器中获取真实世界的测量值 [2D 计划]
- python - 在 Visual Studio 代码调试器中进行 Pytesting Doctests
- python - 无法在 Windows 上下载 lxml
- sql-server - 获取django数据库的脚本
- c++ - Systemc - 将 sc_time 四舍五入到最接近的第 10 个 SC_NS
- java - 试图让超过 20 个追随者显示,我怎样才能循环这个给我更多?