Как исправить недопустимые zip-файлы с недопустимой длиной комментариев в узле (для использования строгими библиотеками, такими как yauzl) - PullRequest
0 голосов
/ 10 сентября 2018

Согласно этой проблеме (# 48) с библиотекой узлов yauzl и , обсуждаемым здесь , существует ошибка со спецификацией zip, и это легко создать недействительные файлы zip.

Высокоуровневая структура файла .zip диктует, что читатель должен сначала найти Конец записи центрального каталога, который находится в самом конце файла .zip. Последнее поле конца записи центрального каталога - это комментарий переменной длины. Длина комментария записывается в поле в конце записи центрального каталога перед самим комментарием. ... буквально единственный способ найти Конец Центральной Каталогной Записи - это использовать эвристику, чтобы угадать, где создатель zip-файла имел в виду это. Спецификация файла .zip неоднозначна; это недостатки.

yauzl ищет магическое число в обратном направлении, и как только оно найдено, yauzl выполняет дополнительную проверку, чтобы убедиться, что это магическое число действительно является частью Конечной записи центрального каталога. Эта проверка включает проверку всех полей в конце записи центрального каталога, включая проверку правильности поля длины комментария. Если какое-либо из полей выглядит подозрительным, zipfile отклоняется.

В настоящее время недопустимые zip-файлы выдают ошибку «недопустимая длина комментария» в yauzl (и, возможно, в других библиотеках, соответствующих спецификации). В этом выпуске упоминается, как исправить недопустимые zip-файлы:

... можно в последний момент восстановить zip-файл, удалив байты из конца zip-файла. Чтобы сделать это, найдите магический номер в обратном направлении от конца (см. Упоминание в спецификации «центральной подписи заголовка файла») и удалите все, что следует за концом записи центрального каталога.

Но нет примеров того, как реализовать это исправление. Таким образом, мой вопрос: учитывая ситуацию, когда у нас есть файловый буфер с недопустимым почтовым индексом, содержащим комментарий недопустимой длины, как бы мы «искали магический номер в обратном направлении от конца и удаляли все, что следует за концом центрального Запись справочника "?

...