目錄 / Table of Contents

Limity bezpieczeństwa ładowania i czytników strumieniowych

To tłumaczenie ma charakter informacyjny; w razie rozbieżności pierwszeństwo ma źródło w języku chińskim tradycyjnym (zh-TW).

Ładowanie pakietów oraz OdsStreamReader/OdtStreamReader przetwarzają niezaufane dane ZIP/XML. Czytniki nie tworzą pełnego modelu DOM dokumentu, ale przydzielają bufory dla bieżącego wiersza, tekstu węzłów, dekompresji ZIP i XML Reader. Konstrukcja o niskim użyciu pamięci rezydentnej nie eliminuje wpływu rozmiaru danych wejściowych.

Limity pakietu podstawowego

OdfDocument.Load, fasady Load poszczególnych formatów i OdfPackage.Open współdzielą budżety OdfLoadOptions.

Limit Wartość domyślna Cel ochrony
Wpisy ZIP 5,000 Zapobiega wyczerpaniu CPU i pamięci przez wiele małych wpisów
Rozpakowany rozmiar jednego wpisu 500 MiB Ogranicza rozwinięcie jednego wpisu ZIP
Łączny rozpakowany rozmiar 1 GiB Ogranicza łączne rozwinięcie pakietu
Surowy rozmiar danych bez wyszukiwania 1 GiB Ogranicza buforowanie przed rozwinięciem ZIP
Znaki w jednym dokumencie XML 64 MiB Ogranicza analizę XML i budowę DOM

Cztery limity ZIP muszą być dodatnie; zero lub wartości ujemne natychmiast powodują ArgumentOutOfRangeException. Tylko MaxXmlCharactersInDocument = 0 wyłącza limit XML. Wszystkie XML Readery muszą blokować zewnętrzne DTD i resolvery. Nowe ścieżki muszą używać OdfLoadOptions. Ścieżki walidacji pakietów i Flat XML (OdfPackageValidator, OdfFlatDocumentValidator oraz skanowanie reguł profili) także stosują MaxXmlCharactersInDocument: walidacja pakietów używa package.LoadOptions, a walidacja Flat używa OdfValidationOptions.LoadOptions (domyślne 64 MiB z OdfLoadOptions, jeśli nie podano). Podpisy, znaczniki czasu, dane o unieważnieniu certyfikatów i zewnętrzne odpowiedzi sieciowe mają własne, mniejsze limity; limit pakietu podstawowego ich nie zastępuje. Zasady treści realizuj przez OdfPackageValidator, SanitizeMacros, walidację podpisu lub pwsh eng/Test-OdfPolicy.ps1.

Limity czytników strumieniowych

Reader Limit Wartość domyślna
ODS Znaki XML 64 MiB
ODS Wiersze w arkuszu 1,048,576
ODS Kolumny w wierszu 16,384
ODS Jedna deklaracja repeat 1,048,576 wierszy; 16,384 kolumny
ODS Tekst pobrany z jednej komórki 16 MiB
ODT Znaki XML 64 MiB
ODT Zwrócone węzły tekstowe 1,000,000
ODT Tekst pobrany z jednego węzła 16 MiB

Po przekroczeniu limitu odczyt kończy się niepowodzeniem; repeat nie jest obcinany, aby nadal zwracać dane, które wyglądają na kompletne. Takie niepowodzenie należy traktować jako wynik ochrony zasobów i nie ponawiać operacji automatycznie z wyłączonymi limitami.

Własność strumieni

Domyślna wartość opcji LeaveOpen to false. Po ustawieniu jej na true zwolnienie Readeru nadal zamyka strumień wpisu XML i ZIP Reader, ale pozostawia otwarty najbardziej zewnętrzny strumień dostarczony przez obiekt wywołujący.

Pozostałe zabezpieczenia zasobów i danych wyjściowych

Oprócz limitów pakietu i czytników strumieniowych przed niezaufanymi danymi wejściowymi chronią także poniższe stałe limity. Obecnie są to stałe w kodzie i nie można ich jeszcze konfigurować przez OdfLoadOptions ani obiekt opcji. Przed podniesieniem lub usunięciem limitu oceń wpływ na pamięć i stos.

Obszar Limit Zachowanie po przekroczeniu
Rzeczywisty rozmiar rozpakowanego wpisu ZIP Nie może przekraczać nieskompresowanego rozmiaru zadeklarowanego w nagłówku (ścieżka MMF przy wczytywaniu z ścieżki pliku) SecurityException
Uszkodzony katalog centralny ZIP lub ZIP64 Szybka ścieżka MMF nie obsługuje ZIP64, a żaden rekord, którego nie da się w pełni przeanalizować, nie może zostać po cichu pominięty Powrót do weryfikacji i odczytu przez ZipArchive
Głębokość zagnieżdżenia elementów XML 256 poziomów (OdfXmlReader.MaxElementDepth); dotyczy wczytywania DOM, wczytywania Flat ODF, walidacji reguł profilu i analizy RDF Wczytywanie zgłasza SecurityException; walidacja raportuje ODF0303 lub ODF0301
Głębokość zagnieżdżenia przy analizie formuł Po 256 poziomów dla nawiasów, argumentów funkcji, tablic wbudowanych i kolejnych operatorów przedrostkowych InvalidOperationException
Łączna liczba węzłów operatorów formuły 4096 (FormulaParser.MaxOperatorNodes); operatory binarne, unarne, procentowe i referencyjne łącznie. Formuły łańcuchowe tworzą drzewa głębokie w lewo, których obliczanie i serializacja rekurencyjnie schodzą poziom po poziomie; limit ten zapewnia, że wystarczy zwykły stos wątku InvalidOperationException
Zapas stosu przy rekurencji formuł Analiza, obliczanie, pobieranie zakresów i serializacja sprawdzają pozostały stos (RuntimeHelpers.EnsureSufficientExecutionStack) przed wejściem na każdy poziom rekurencji; nawet formuły bliskie limitom nie powodują awarii procesu na wątkach z małym stosem 128–256 KB InsufficientExecutionStackException; EvaluateFormulas zamienia go na wyjątek obliczania formuły lub #VALUE!
Długość tekstowego wyniku formuły 1 048 576 znaków (&, wyniki funkcji, SUBSTITUTE, REPT) Zwraca #VALUE!
Funkcje formuł, których granicą pętli jest argument BINOMDIST skumulowane 100 000; CRITBINOM, HYPGEOMDIST skumulowane 100 000; POISSON skumulowane 1 000 000; DB, DDB, VDB, CUMIPMT okresy 1 000 000 Zwraca #NUM!
Indeks wiersza/kolumny arkusza Wiersz 1 048 575, kolumna 16 383 (OdfSpreadsheetLimits) ArgumentOutOfRangeException
Dołączanie dokumentu Dokumentu nie można dołączyć do niego samego ArgumentException
Collaboration addColumns Ograniczone liczbą kolumn i łączną liczbą komórek w OdtOperationSafetyOptions Zapisuje limit bezpieczeństwa w dzienniku i pomija operację
Zastępczy obraz wykresu 4096 px na bok Ograniczany do limitu
Format konwersji LibreOffice Część rozszerzenia przed dwukropkiem nie może być pusta ani zawierać .., NUL, CR lub LF ArgumentException
Zapytanie SPARQL Klauzule SERVICE nie są dozwolone (zapobiega wysyłaniu przez silnik zapytań żądań sieciowych do dowolnych punktów końcowych) ArgumentException

Granica zaufania

Dla niezaufanych dokumentów zachowaj limity domyślne i najpierw wykonaj walidację package i schema. Można zwiększyć poszczególne limity dla zaufanych dużych dokumentów, które rzeczywiście trzeba przetworzyć, ale zwiększenie limitów XML lub tekstu podnosi także ryzyko ataku na pamięć i CPU DoS. MaxXmlCharactersInDocument = 0 wyłącza tylko limit znaków XML; pozostałe limity Readeru nadal obowiązują.

Opcje Readerów ODS i ODT sprawdzają reguły przy przypisaniu: limit XML dopuszcza zero, a limity wierszy, kolumn, repeat, węzłów i tekstu muszą być większe od zera.

Limity bezpieczeństwa, walidacja i oczyszczanie zmniejszają ryzyko, ale nie gwarantują całkowitego bezpieczeństwa wobec złośliwych dokumentów.