Перед обробкою DOCX і EPUB встановіть бюджет для розпакування ZIP
DOCX — це, по суті, набір записів ZIP, а EPUB також використовує ZIP-контейнер. Те, що ви отримуєте дуже малий стиснутий файл, не означає, що він буде меншим після того, як ви його розархівуєте. Обсяг стиснення, кількість записів, розмір окремого елемента та загальний обсяг розширення слід обмежити в точці входу, а не чекати, поки пам’ять вичерпається, перш ніж визначити, що файл ненормальний.
Коли ви маєте справу з DOCX і EPUB, багато проблем виникають уже на етапі декомпресії. DOCX — це, по суті, набір записів ZIP, а EPUB також використовує ZIP-контейнер, тому малий розмір файлу не означає, що він стане меншим після розпакування. Ця стаття призначена для розробників, експлуатаційного та обслуговуючого персоналу, яким потрібно отримати документи Office або електронні книги та виконати подальшу обробку. Він знайомить з тим, як встановити бюджет для розпакування ZIP на вході.
Прочитавши це, ви зможете визначити, які обмеження слід розмістити на вході, як повернути користувачеві інформацію про відмову, яка діє, і як відрізнити проблеми з контейнером від проблем з перекладом, коли переклад не вдається. Приклади в цій статті демонструються з використанням синтетичних зразків, а код пройшов перевірку зразків в ізольованому середовищі, але це не означає, що він дійсний для всіх реальних файлів. Перед обробкою важливих документів збережіть оригінали та перегляньте їх відповідно до меж і пунктів прийняття в тексті.
Як встановити бюджет для розпакування ZIP перед обробкою DOCX і EPUB? Висновок одним реченням
Обсяг стиснення, кількість записів, розмір окремого елемента та загальна величина розширення повинні бути обмежені в точці входу. Не чекайте, поки пам'ять вичерпається, перш ніж виявити аномалії файлів.
| ваша ситуація | Рекомендовані практики | причина |
|---|---|---|
| Отримайте файл у форматі DOCX або EPUB | Обмежте обсяг стиснення, кількість записів, розмір окремого елемента та загальну кількість розширення на вході | Невеликий розмір стиснутого пакета не означає, що він стане меншим після розпакування. |
| Я хочу зробити попередню перевірку лише за каталогом. | Таблиця каталогу використовується для раннього відхилення під час накопичення байтів, прочитаних під час декомпресії. | Таблиці каталогу не замінюють обмеження часу виконання |
| Розумно великий документ перевищує бюджет | Забезпечте незалежну велику чергу файлів або вхід для ручної обробки | Розумна документація також може перевищувати бюджет, але не повинна знімати всі обмеження |
| Помилка перекладу | Спочатку розрізняйте пошкодження контейнера та помилку перекладу | Проблема може бути на етапі підготовки вхідних даних |
Чому нам спочатку потрібно дивитися на розгорнутий розмір?
І DOCX, і EPUB використовують ZIP як контейнер. Файл розміром у кілька сотень Кб може зайняти багато місця після розпакування. Якби система дивилася лише на розмір завантаженого файлу, вона не могла б виявити цей тип ризику.
Тому перевірка на вході має охоплювати одночасно такі аспекти:
- Обсяг стиснення: обмежує розмір самого завантаженого файлу.
- Кількість записів: обмежте кількість файлів у контейнері.
- Один розмір елемента: обмежте розгорнутий розмір будь-якого елемента.
- Загальне розширення: обмежте загальну кількість байтів після розширення всіх записів.
Спочатку перевірте зміст, але не сприймайте це як остаточну гарантію
ZipInfo надає заявлений розмір і стиснутий розмір, придатний для попереднього відбору. Це допомагає системі швидко відхиляти файли, які явно перевищують бюджет перед декомпресією.
Однак інформація в таблиці каталогів оголошується самим файлом і їй не можна повністю довіряти. Під час фактичного розпакування вам все одно потрібно накопичити прочитані байти та встановити час і бюджет пам’яті. Таблиці каталогу можуть відхиляти файли достроково, але вони не можуть замінити обмеження часу виконання.
Приклад попереднього скринінгу без декомпресії
from io import BytesIO
from pathlib import PurePosixPath
from zipfile import ZipFile, ZIP_DEFLATED
def inspect(raw, max_entries=10, max_total=4096):
if len(raw) > 4096:
raise ValueError("compressed input budget")
with ZipFile(BytesIO(raw)) as z:
items = z.infolist()
if len(items) > max_entries:
raise ValueError("entry count budget")
total, seen = 0, set()
for item in items:
name = item.filename
path = PurePosixPath(name)
if (path.is_absolute() or ".." in path.parts or
"\\" in name or ":" in name or name in seen):
raise ValueError("unsafe or duplicate name")
seen.add(name)
total += item.file_size
if total > max_total:
raise ValueError("expanded budget")
return len(items), total
def sample(name, data):
out = BytesIO()
with ZipFile(out, "w", ZIP_DEFLATED) as z:
z.writestr(name, data)
return out.getvalue()
assert inspect(sample("word/document.xml", b"<doc/>")) == (1, 6)
for raw in [sample("../escape", b"x"), sample("large", b"x" * 5000)]:
try:
inspect(raw)
except ValueError:
pass
else:
raise AssertionError("unsafe archive accepted")
Бюджети в цьому прикладі є невеликими значеннями, вибраними для демонстрації шляхів відхилення, і їх неможливо безпосередньо відтворити у виробничому середовищі. Приклад не викликає extractall і не записує записи ZIP, отже, це не повністю безпечний декомпресор.
Зашифровані записи, символічні посилання, вкладені архіви та споживання ресурсів самим парсером вимагають окремих політик.
Джерела: Python zipfile.
Дайте користувачеві корисну інформацію під час відхилення
Користувачі повинні знати, що робити далі, якщо файл відхилено; достатню кількість інформації про усунення несправностей потрібно реєструвати у внутрішньому журналі. У наведеній нижче таблиці наведено відповідні методи обробки для типових умов запуску:
| Умова тригера | Інструкції для користувачів | внутрішні записи |
|---|---|---|
| Загальне розширення перевищує бюджет | Розгорнутий файл завеликий | Граничні імена та спостережувані значення |
| Дубльована назва статті | Структура контейнера незрозуміла | Індекс запису, не повний текст записаний |
| Транскордонні маршрути | Файлові структури не підтримуються | Ідентифікатор асоціації інциденту безпеки |
| Пошкодження контейнера | Будь ласка, переекспортуйте файл | Типи винятків для розбору |
Пояснення користувачам мають бути короткими та зрозумілими, уникаючи надмірного розкриття внутрішніх деталей; Внутрішні записи повинні зберігати лімітні імена, спостереження та типи аномалій для полегшення подальшого усунення несправностей.
Не закривайте всі обмеження лише заради сумісності
Досить великі документи також можуть перевищувати бюджет. На цьому етапі розумним підходом є надання незалежних великих черг файлів або точок ручної обробки, а не послаблення всіх обмежень завдань.
Збільшення бізнес-квоти орендаря не означає дозволу на необмежену декомпресію всіх завдань. Обмеження потрібно ізолювати від виконання і не можна записувати лише поруч із кнопкою завантаження.
Розрізняйте, на якому рівні є невдача перекладу шарів
Під час підготовки до подання документів до OmniDoc (Запис продукту) спочатку відокреміть пошкодження контейнера від невдачі перекладу. DOCX, який навіть не може читати XML, може мати проблеми під час підготовки вхідних даних. Чіткий звіт перед інспекцією дозволяє користувачам знати, чи варто повторно експортувати, стискати зображення або звертатися до сервісів перекладу для усунення несправностей.
📊 Порівняння ядра
| Перевірте таймінг | Основна функція | Обмеження |
|---|---|---|
Перевірте таблицю каталогів перед вилученням (ZipInfo) | Попередньо відфільтруйте на основі заявленого розміру та розміру стиснення, а також відхиляйте файли, які явно перевищують ліміт заздалегідь | Інформація про оголошення походить із самого файлу і не може замінити обмеження під час виконання |
| Накопичення байтів, прочитаних під час вилучення | Координуйте час і бюджет пам'яті для контролю фактичного розгортання | Під час читання необхідний безперервний підрахунок |
🎯 Який метод тобі підходить?
Якщо вам потрібно отримати DOCX або EPUB, завантажений користувачем,
У точці входу одночасно перевіряйте обсяг стиснення, кількість записів, розмір окремого елемента та загальне розширення перед подальшою обробкою.
Якщо ви переважно покладаєтеся на зміст для перевірки,
Використовуйте таблицю каталогів як метод превентивного відхилення, одночасно накопичуйте байти прочитаних під час фактичного вилучення та встановлюйте бюджети часу та пам'яті.
Якщо ви часто зустрічаєте досить великі документи
Забезпечте незалежні великі черги файлів або точки ручної обробки для цих документів; не вимикайте всі обмеження лише для сумісності.
Якщо ви готові подати документи до OmniDoc
По-перше, розрізняйте пошкодження контейнера та несправність трансляції. Проблеми, виявлені під час попередньої перевірки, можна повідомити користувачам якомога раніше.
❓ Поширені запитання (FAQ)
1. Чи можна безпосередньо використовувати розмір у таблиці каталогів для визначення безпеки файлів?
Не можна повністю на це покладатися. Заявлений розмір, наданий ZipInfo, підходить для попереднього відбору, але фактичне вилучення все одно вимагає накопичення байтів читання та встановлення часу та бюджету пам'яті.
2. Чому стиснутий пакет такий маленький, але коли його розпаковують, він може бути досить великим?
І DOCX, і EPUB використовують ZIP як свій контейнер; маленький стиснений пакет не означає, що розмір після розширення теж малий. Тому необхідно обмежити загальну кількість розгортання.
3. Як слід поводитися з великими документами, які перевищують бюджет?
Досить великі документи можуть також перевищувати бюджет, забезпечуючи окремі великі черги файлів або точки ручної обробки замість закриття всіх обмежень.
4. Коли переклад не вдається, як визначити, де лежить проблема?
По-перше, розрізняйте пошкодження контейнера та несправність трансляції. DOCX, який навіть не може читати XML, може мати проблеми на етапі підготовки вхідних даних. Чіткий звіт про попередню перевірку допомагає користувачам вирішити, чи експортувати зображення, стискати зображення або звертатися до служби перекладу для усунення несправностей.
📝 Резюме
Ліміт декомпресії ZIP на записі повинен одночасно охоплювати об'єм стиснення, кількість записів, розмір окремого елемента та загальну кількість розширення, а також кумулятивні перевірки під час виконання. Чітка підказка користувачам щодо наступного кроку при відмові полегшує вирішення проблеми.
Досвід зараз: завантажте документ, щоб почати переклад, зберігаючи оригінальне форматування


