Stel een budget in voor ZIP-decompressie voordat u DOCX en EPUB verwerkt

DOCX is in wezen een reeks ZIP-items, en EPUB gebruikt ook een ZIP-container. Het feit dat u een gecomprimeerd bestand ontvangt dat erg klein is, betekent niet dat het nog steeds kleiner zal zijn nadat u het hebt uitgepakt. Het compressievolume, het aantal items, de individuele itemgrootte en de totale uitbreidingshoeveelheid moeten worden beperkt op het ingangspunt, in plaats van te wachten tot het geheugen vol is voordat wordt vastgesteld dat het bestand abnormaal is.

Bij het omgaan met DOCX en EPUB doen zich al veel problemen voor tijdens de decompressiefase. DOCX is in wezen een reeks ZIP-items, en EPUB gebruikt ook een ZIP-container, dus de kleine bestandsgrootte betekent niet dat deze kleiner zal zijn na het uitpakken. Dit artikel is bedoeld voor ontwikkelaars en bedienings- en onderhoudspersoneel dat Office-documenten of e-books moet ontvangen en de daaropvolgende verwerking moet uitvoeren. Het introduceert hoe u een budget kunt instellen voor ZIP-decompressie bij de ingang.

Nadat u dit heeft gelezen, kunt u bepalen welke beperkingen er bij de ingang moeten worden geplaatst, hoe u bruikbare weigeringsinformatie aan de gebruiker kunt retourneren en hoe u containerproblemen kunt onderscheiden van vertaalproblemen wanneer de vertaling mislukt. De voorbeelden in dit artikel worden gedemonstreerd met behulp van synthetische voorbeelden, en de code heeft de voorbeeldcontroles in een geïsoleerde omgeving doorstaan, maar dit betekent niet dat deze geldig is voor alle echte bestanden. Voordat u belangrijke documenten verwerkt, dient u de originelen te bewaren en deze te controleren op basis van de grenzen en acceptatie-items in de tekst.

Hoe stel ik een budget in voor ZIP-decompressie voordat DOCX en EPUB worden verwerkt? Conclusie in één zin

Het compressievolume, het aantal inzendingen, de individuele itemgrootte en de totale uitbreidingshoeveelheid moeten op het instappunt beperkt zijn. Wacht niet tot het geheugen vol is voordat u bestandsafwijkingen ontdekt.

jouw situatieAanbevolen praktijkenreden
Ontvang een DOCX- of EPUB-gecomprimeerd bestandBeperk het compressievolume, het aantal inzendingen, de individuele artikelgrootte en het totale uitbreidingsbedrag bij de ingangHet kleine formaat van het gecomprimeerde pakket betekent niet dat het kleiner zal zijn na het uitpakken ervan.
Ik wil een pre-screening doen op basis van alleen de catalogus.De directorytabel wordt gebruikt voor vroegtijdige afwijzing tijdens het verzamelen van de bytes die tijdens de decompressie zijn gelezen.Catalogustabellen zijn geen vervanging voor runtimebeperkingen
Een redelijk groot document overschrijdt het budgetZorg voor een onafhankelijke wachtrij voor grote bestanden of voor handmatige verwerkingRedelijke documentatie kan ook het budget overschrijden, maar mag niet alle beperkingen wegnemen
Vertaling misluktMaak eerst onderscheid tussen containerschade en vertaalfoutenHet probleem kan liggen in de voorbereidingsfase van de input

Waarom moeten we eerst naar de uitgebreide grootte kijken?

Zowel DOCX als EPUB gebruiken ZIP als container. Een bestand van enkele honderden KB's kan na het uitpakken veel ruimte in beslag nemen. Als het systeem alleen naar de grootte van het geüploade bestand zou kijken, zou het dit soort risico niet kunnen detecteren.

Daarom moet de inspectie bij de ingang tegelijkertijd de volgende aspecten omvatten:

  • Compressievolume: beperk de grootte van het geüploade bestand zelf.
  • Aantal vermeldingen: beperk het aantal bestanden in de container.
  • Grootte van één item: beperk de uitgebreide grootte van elk item.
  • Totale uitbreiding: beperk het totale aantal bytes na uitbreiding van alle vermeldingen.

Controleer eerst de inhoudsopgave, maar beschouw deze niet als definitieve garantie

ZipInfo biedt aangegeven grootte en gecomprimeerde grootte, geschikt voor pre-screening. Het helpt het systeem snel bestanden te weigeren die het budget duidelijk overschrijden voordat ze worden gedecomprimeerd.

De informatie in de directorytabel wordt echter door het bestand zelf aangegeven en kan niet volledig worden vertrouwd. Wanneer u daadwerkelijk gaat decomprimeren, moet u nog steeds de gelezen bytes verzamelen en het tijd- en geheugenbudget instellen. Catalogustabellen kunnen bestanden vroegtijdig afwijzen, maar kunnen runtimebeperkingen niet vervangen.

Een voorbeeld van pre-screening zonder decompressie

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")

De budgetten in dit voorbeeld zijn kleine waarden die zijn gekozen om afwijzingspaden aan te tonen en kunnen niet rechtstreeks worden gerepliceerd in een productieomgeving. Het voorbeeld roept extractall niet aan en schrijft ook geen ZIP-items, dus het is geen volledig veilige decompressor.

Gecodeerde gegevens, symbolische koppelingen, geneste archieven en het bronnenverbruik van de parser zelf vereisen allemaal afzonderlijk beleid.

Bronnen: Python zipfile.

Geef de gebruiker bruikbare informatie bij afwijzing

Gebruikers moeten weten wat ze moeten doen als een bestand wordt afgewezen; Er moet voldoende informatie over het oplossen van problemen intern worden vastgelegd. De volgende tabel geeft de overeenkomstige verwerkingsmethoden voor veelvoorkomende triggeromstandigheden:

TriggerconditieInstructies voor gebruikersinterne administratie
De totale uitbreiding overtreft het budgetBestand is te groot wanneer het is uitgevouwenBeperk namen en observaties
Dubbele invoernaamDe structuur van de container is onduidelijkInvoerindex, volledige tekst niet opgenomen
pad buiten de grenzenBestandsstructuur wordt niet ondersteundCorrelatie-ID voor beveiligingsincidenten
Houder beschadigdExporteer het bestand opnieuwUitzonderingstype parseren

Instructies voor gebruikers moeten kort en duidelijk zijn om te voorkomen dat te veel interne details bekend worden gemaakt; interne records moeten beperkte namen, observatiewaarden en uitzonderingstypen bevatten om later onderzoek te vergemakkelijken.

Schakel niet alle beperkingen uit voor compatibiliteit

Redelijk grote documenten kunnen ook uw budget overschrijden. Op dit moment is het veiliger om een onafhankelijke wachtrij voor grote bestanden of een handmatige verwerkingsinvoer te bieden, in plaats van de beperkingen voor alle taken te versoepelen.

Het verhogen van het bedrijfsquotum van een bepaalde huurder betekent niet dat alle taken onbeperkt kunnen worden gedecomprimeerd. Beperkingen moeten gepaard gaan met uitvoeringsisolatie, en mogen niet alleen naast de uploadknop worden geschreven.

Als de vertaling mislukt, moet je identificeren op welke laag deze zich bevindt.

Wanneer u zich voorbereidt op het indienen van een document bij OmniDoc (productportaal), moet u eerst containercorruptie scheiden van mislukte vertalingen. Bij een DOCX die XML niet eens kan lezen, kan het probleem zich voordoen in de invoervoorbereidingsfase. Een duidelijk preflightrapport laat gebruikers weten of ze afbeeldingen opnieuw moeten exporteren, comprimeren of contact moeten opnemen met een vertaalservice voor probleemoplossing.

📊 Kernvergelijking

Controleer de timingHoofdfunctiebeperkingen
Controleer de directorytabel vóór decompressie (ZipInfo)Pre-screening op basis van aangegeven grootte en compressiegrootte, en weiger bestanden die duidelijk de limiet overschrijden voorafDe declaratiegegevens komen uit het bestand zelf en vervangen de runtimebeperkingen niet
Cumulatieve bytes gelezen tijdens decompressieWerk samen met tijd- en geheugenbudget om de daadwerkelijke uitbreidingshoeveelheid te controlerenTijdens het lezen moet u blijven tellen

🎯 Welke methode is geschikt voor jou?

Als u DOCX of EPUB wilt ontvangen die door gebruikers zijn geüpload

Controleer bij de ingang tegelijkertijd het compressievolume, het aantal inzendingen, de grootte van het afzonderlijke artikel en het totale expansiebedrag voordat u de volgende verwerking ingaat.

Als u voor controle voornamelijk op directorytabellen vertrouwt

Gebruik de directorytabel als een middel voor vroege afwijzing, terwijl u de bytes verzamelt die tijdens de daadwerkelijke decompressie zijn gelezen, en tijd- en geheugenbudgetten instelt.

Als u regelmatig redelijk grote documenten tegenkomt

Zorg voor een aparte wachtrij voor grote bestanden of voor handmatige verwerking van dergelijke documenten, en schakel niet alle beperkingen uit omwille van de compatibiliteit.

Als u klaar bent om een document naar OmniDoc te verzenden

Maak eerst onderscheid tussen containerschade en vertaalfouten. Problemen die tijdens de pre-inspectiefase ontdekt kunnen worden, kunnen zo vroeg mogelijk aan gebruikers worden gemeld.

❓ Veelgestelde vragen (FAQ)

1. Kan de grootte in de directorytabel direct worden gebruikt om te bepalen of het bestand veilig is?

Kan niet volledig op vertrouwd worden. De door ZipInfo geleverde declaratiegrootte is geschikt voor pre-screening, maar het is nog steeds nodig om de gelezen bytes te verzamelen en het tijd- en geheugenbudget in te stellen tijdens de daadwerkelijke decompressie.

2. Waarom is het gecomprimeerde pakket erg klein, maar kan het na decompressie erg groot zijn?

Zowel DOCX als EPUB gebruiken ZIP als container. De kleine omvang van het gecomprimeerde pakket betekent niet dat het uitgebreide volume ook klein zal zijn. Daarom is het noodzakelijk om de totale expansiehoeveelheid te beperken.

3. Hoe om te gaan met grote documenten die het budget overschrijden?

Redelijk grote documenten kunnen ook het budget overschrijden, en er kan worden gezorgd voor een aparte wachtrij voor grote bestanden of voor handmatige verwerking, in plaats van alle limieten uit te schakelen.

4. Als de vertaling mislukt, hoe kun je dan bepalen in welke laag het probleem ligt?

Maak eerst onderscheid tussen containerschade en vertaalfouten. Voor een DOCX die niet eens XML kan lezen, kan het probleem zich voordoen in de invoervoorbereidingsfase. Een duidelijk pre-checkrapport kan gebruikers helpen beslissen of ze afbeeldingen opnieuw willen exporteren, comprimeren of contact moeten opnemen met een vertaalservice voor probleemoplossing.

📝 Samenvatting

De ZIP-decompressielimiet bij de invoer moet zowel het gecomprimeerde volume, het aantal vermeldingen, de individuele itemgrootte als de totale uitbreidingshoeveelheid omvatten, en samenwerken met de cumulatieve controle tijdens runtime. Door de gebruiker een duidelijke volgende stap te geven bij het afwijzen, kan het probleem gemakkelijker op te lossen zijn.

Probeer het nu: upload het document om de vertaling te starten, waarbij de oorspronkelijke lay-out behouden blijft

Bijgewerkt op 2026-11-13