Sicherheitsgrenzen für Laden und Streaming-Reader
Diese Übersetzung dient nur zur Information; bei Abweichungen gilt die maßgebliche zh-TW-Quelle.
Das Laden von Kernpaketen und OdsStreamReader/OdtStreamReader verarbeiten nicht vertrauenswürdige ZIP/XML-Eingaben. Die Reader erstellen kein vollständiges Dokument-DOM, benötigen aber
Puffer für aktuelle Zeilen, Knotentext, ZIP-Dekomprimierung und den XML-Reader. Geringer Speicherbedarf
bedeutet nicht, dass die Eingabegröße ohne Einfluss bleibt.
Grenzen für Kernpakete
OdfDocument.Load, formatspezifische Load-Fassaden und direkte Aufrufe von OdfPackage.Open verwenden gemeinsam die Ressourcenbudgets von OdfLoadOptions.
| Grenze | Standardwert | Schutzzweck |
|---|---|---|
| ZIP-Einträge | 5,000 | Verhindert CPU- und Speichererschöpfung durch viele kleine Einträge |
| Entpackte Größe eines Eintrags | 500 MiB | Begrenzt die Expansion eines ZIP-Eintrags |
| Gesamte entpackte Paketgröße | 1 GiB | Begrenzt die gesamte Expansion aller Einträge |
| Rohgröße nicht durchsuchbarer Eingaben | 1 GiB | Begrenzt die Pufferung vor der ZIP-Expansion |
| Zeichen in einem XML-Dokument | 64 MiB | Begrenzt XML-Verarbeitung und DOM-Aufbau |
Eintragsanzahl, Eintragsgröße, Gesamtexpansion und rohe Paketgröße müssen positiv sein. Null oder negative Werte lösen sofort ArgumentOutOfRangeException aus. Nur MaxXmlCharactersInDocument = 0 deaktiviert die XML-Zeichengrenze; negative Werte bleiben ungültig.
Alle XML-Reader des Kerns müssen externe DTDs und Resolver verbieten. Neue Ladepfade müssen OdfLoadOptions oder gleichwertige dokumentierte Budgets verwenden. Die Validierungspfade für Pakete und Flat XML (OdfPackageValidator, OdfFlatDocumentValidator und Profilregelprüfungen) wenden ebenfalls MaxXmlCharactersInDocument an: Die Paketvalidierung verwendet package.LoadOptions, die Flat-Validierung OdfValidationOptions.LoadOptions (bei fehlender Angabe den Standardwert 64 MiB aus OdfLoadOptions). Signaturen, Zeitstempel, Zertifikatswiderrufsdaten und externe Netzwerkantworten besitzen eigene kleinere Grenzen; die Kernpaketgrenze ersetzt diese nicht. Diese Grenzen schützen Ressourcen, nicht den Dokumentinhalt; verwenden Sie für Richtlinien OdfPackageValidator, SanitizeMacros, Signaturprüfung oder pwsh eng/Test-OdfPolicy.ps1.
Weitere Ressourcen- und Ausgabeschutzmaßnahmen
Neben den Paket- und Streaming-Reader-Grenzen schützen auch die folgenden festen Grenzen vor nicht vertrauenswürdigen Eingaben. Diese Werte sind derzeit feste Konstanten im Code und lassen sich noch nicht über OdfLoadOptions oder ein Optionsobjekt konfigurieren. Bewerten Sie vor dem Erhöhen oder Entfernen einer Grenze die Auswirkungen auf Speicher und Stapel.
| Bereich | Grenze | Verhalten bei Überschreitung |
|---|---|---|
| Tatsächliche entpackte Größe eines ZIP-Eintrags | Darf die im Header angegebene unkomprimierte Größe nicht überschreiten (MMF-Pfad beim Laden über einen Dateipfad) | SecurityException |
| Beschädigtes ZIP-Zentralverzeichnis oder ZIP64 | Der MMF-Schnellpfad unterstützt kein ZIP64, und kein Eintrag, der sich nicht vollständig auswerten lässt, darf stillschweigend übersprungen werden | Weicht auf Prüfung und Lesen über ZipArchive aus |
| Verschachtelungstiefe von XML-Elementen | 256 Ebenen (OdfXmlReader.MaxElementDepth); gilt für DOM-Laden, Flat-ODF-Laden, Profilregelprüfung und RDF-Analyse |
Laden löst SecurityException aus; die Validierung meldet ODF0303 oder ODF0301 |
| Verschachtelungstiefe beim Formelparsen | Je 256 Ebenen für Klammern, Funktionsargumente, Inline-Arrays und aufeinanderfolgende Präfixoperatoren | InvalidOperationException |
| Gesamtzahl der Operatorknoten einer Formel | 4.096 (FormulaParser.MaxOperatorNodes); binäre, unäre, Prozent- und Bezugsoperatoren zusammen. Verkettete Formeln bilden linkstiefe Bäume, deren Auswertung und Serialisierung ebenenweise rekursiv erfolgen; diese Grenze stellt sicher, dass ein gewöhnlicher Thread-Stapel ausreicht |
InvalidOperationException |
| Stapelreserve bei Formelrekursion | Parsen, Auswertung, Bereichsermittlung und Serialisierung prüfen vor jeder Rekursionsebene den verbleibenden Stapel (RuntimeHelpers.EnsureSufficientExecutionStack); selbst Formeln nahe den Grenzen bringen den Prozess auf Threads mit kleinem 128–256-KB-Stapel nicht zum Absturz |
InsufficientExecutionStackException; EvaluateFormulas wandelt sie in eine Formelauswertungsausnahme oder #VALUE! um |
| Länge des Zeichenfolgenergebnisses einer Formel | 1.048.576 Zeichen (&, Funktionsergebnisse, SUBSTITUTE, REPT) |
Gibt #VALUE! zurück |
| Formelfunktionen, deren Schleifengrenze ein Argument ist | BINOMDIST kumulativ 100.000; CRITBINOM, HYPGEOMDIST kumulativ 100.000; POISSON kumulativ 1.000.000; DB, DDB, VDB, CUMIPMT Perioden 1.000.000 |
Gibt #NUM! zurück |
| Zeilen-/Spaltenindex der Tabelle | Zeile 1.048.575, Spalte 16.383 (OdfSpreadsheetLimits) |
ArgumentOutOfRangeException |
| Dokument anhängen | Ein Dokument darf nicht an sich selbst angehängt werden | ArgumentException |
Collaboration addColumns |
Begrenzt durch Spaltenanzahl und Gesamtzahl der Zellen in OdtOperationSafetyOptions |
Protokolliert die Sicherheitsgrenze und überspringt den Vorgang |
| Diagramm-Ersatzbild | 4.096 px pro Seite | Wird auf die Grenze begrenzt |
| LibreOffice-Konvertierungsformat | Der Erweiterungsteil vor dem Doppelpunkt darf nicht leer sein und weder .., NUL, CR noch LF enthalten |
ArgumentException |
| SPARQL-Abfrage | SERVICE-Klauseln sind nicht zulässig (verhindert, dass die Abfrage-Engine Netzwerkanfragen an beliebige Endpunkte sendet) |
ArgumentException |
Grenzen der Streaming-Reader
| Reader | Grenze | Standardwert |
|---|---|---|
| ODS | XML-Zeichen | 64 MiB |
| ODS | Zeilen pro Arbeitsblatt | 1,048,576 |
| ODS | Spalten pro Zeile | 16,384 |
| ODS | Einzelne repeat-Angabe | Zeilen 1,048,576; Spalten 16,384 |
| ODS | Text einer Zelle | 16 MiB |
| ODT | XML-Zeichen | 64 MiB |
| ODT | Zurückgegebene Textknoten | 1,000,000 |
| ODT | Text eines Knotens | 16 MiB |
Beim Überschreiten schlägt das Lesen fehl; repeat-Daten werden nicht abgeschnitten und als scheinbar vollständig zurückgegeben. Wiederholen Sie den Vorgang nicht automatisch ohne Grenzen.
LeaveOpen ist standardmäßig false. Bei true werden XML-Entry-Stream und ZIP-Reader geschlossen,
der äußerste vom Aufrufer bereitgestellte Stream bleibt jedoch geöffnet.
Behalten Sie für nicht vertrauenswürdige Dokumente die Standardgrenzen bei und validieren Sie Paket und
Schema. Höhere XML- oder Textgrenzen erhöhen auch Speicher- und CPU DoS-Risiken.
MaxXmlCharactersInDocument = 0 deaktiviert nur die XML-Zeichengrenze. Grenzen, Validierung und
Bereinigung verringern Risiken, garantieren aber keine absolute Sicherheit vor bösartigen Dokumenten.
ODS- und ODT-Reader-Optionen prüfen dieselben Regeln bereits beim Zuweisen der Eigenschaften: Die XML-Grenze akzeptiert null, lehnt negative Werte jedoch ab; Zeilen-, Spalten-, repeat-, Knoten- und Textgrenzen müssen größer als null sein.