EugeneRoshal
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору SDZ0 Цитата: EugeneRoshal Я подумаю, нужно ли в связи с этим что-то менять в WinRAR. | Пожалуй, я добавлю определение таких архивов и остановку распаковки. Правда в свежем патче InfoZip unzip для этого хранят список отсортированных смещений и размеров всех файлов и для каждой записи central directory выполняют поиск по этому списку. Это затратно по расходу памяти, времени и коду, так что я пока склоняюсь к тому, чтобы просто проверять, что следующее смещение из central directory превышает значение предыдущего смещения плюс упакованный размер файла. Это должно работать, если записи в central directory идут в том же порядке, что и local headers. Пока что мне не попадались zip архивы, в которых порядок этих записей не совпадает. Но в любом случае это частное решение, не устраняющее основную проблему. Как я уже писал, можно создать корректные архивы с очень высокой степенью сжатия, не прибегая к указанному в статье трюку. Более универсальным решением была бы выдача предпреждения и запроса на продолжение, если по ходу распаковки нам не понравилось соотношение уже распакованных данных к размеру архива. Скажем, если размер уже распакованных данных больше 10гб и при этом превышает размер всего архива в 256 или более раз, запрашиваем подтверждение на продолжение распаковки. Но я сомневаюсь, нужно ли реально это делать. Например, для указанного выше соотношения неизбежно пострадает часть вполне легитимных архивов. Какие-нибудь образы дисков или пустые заготовки баз данных с высокой степенью сжатия. Если менять критерии проверки в сторону ужесточения, например, 100гб и 1000 раз, ложные срабатывания мы уменьшим, но полностью не исключим. При этом часть злонамеренных архивов мы перестанем обнаруживать. Сложность в том, что граница между этими архивами размыта, и какая-нибудь пустая база данных, пожатая в bz2, практически ничем не отличается от злонамеренного архива. Да, можно сделать опцию. Но если ее оставить включенной по умолчанию и не ужесточить критерии проверки, рано или поздно почти любой пользователь не сможет распаковать нормальный архив и полезет искать, где эта опция отключается. Если ее выключить по умолчанию, так ее никто и не включит. Кроме того, большой вопрос - насколько эта проблема вообще существенна для архиватора общего назначения. Да, какую-нибудь автоматическую систему обработки архивов этим можно озадачить. Но в архиваторе, ну увидел, что распаковывается что-то несуразно большое, прервал распаковку и стер мусор. Или в худшем случае дождался ошибки записи по исчерпанию дискового пространства и тоже стер мусор. Ущерб минимален. И не слышал я со времен Фидо, чтобы такие архивы зачем-то рассылали пользователям. Выгоды никакой. Да и в Фидо их слали автоматическим системам обработки почты, а не людям. Так что пока я скорее склоняюсь к тому, что общие проверки на степень сжатия для всех типов архивов при распаковке не нужны. По крайней мере, если не поднимется шум на эту тему или применение таких архивов действительно не станет мешать пользователям. А частную проверку конкретно на этот тип модифицированных zip можно добавить. Тут четко виден умысел, и нормальных архивов с такой структурой быть не должно. Тормоза в интерфейсе при распаковке ZIP архивов с высокой степенью сжатия я поправил. |