Limites de sécurité du chargement et des lecteurs en continu
Traduction informative : en cas de divergence, la source zh-TW fait foi.
Le chargement des paquets et OdsStreamReader/OdtStreamReader traitent des entrées ZIP/XML non fiables. Les lecteurs ne construisent pas le DOM complet, mais allouent des tampons pour
la ligne courante, le texte des nœuds, la décompression ZIP et le lecteur XML. Une faible mémoire
résidente ne rend pas l’utilisation des ressources indépendante de la taille d’entrée.
Limites du paquet principal
OdfDocument.Load, les façades Load et OdfPackage.Open partagent les budgets de OdfLoadOptions.
| Limite | Valeur par défaut | Protection |
|---|---|---|
| Entrées ZIP | 5,000 | Évite l’épuisement du processeur et de la mémoire par de nombreuses petites entrées |
| Taille décompressée d’une entrée | 500 MiB | Limite l’expansion d’une entrée ZIP |
| Taille décompressée totale | 1 GiB | Limite l’expansion totale du paquet |
| Entrée brute non recherchable | 1 GiB | Limite la mise en mémoire tampon avant l’expansion ZIP |
| Caractères d’un document XML | 64 MiB | Limite l’analyse XML et la construction du DOM |
Les quatre limites ZIP doivent être positives ; zéro ou une valeur négative déclenche immédiatement ArgumentOutOfRangeException. Seul MaxXmlCharactersInDocument = 0 désactive la limite XML. Tous les lecteurs XML doivent interdire les DTD et resolvers externes. Les nouveaux chemins doivent réutiliser OdfLoadOptions. Les chemins de validation des paquets et du Flat XML (OdfPackageValidator, OdfFlatDocumentValidator et l’analyse des règles de profil) appliquent également MaxXmlCharactersInDocument : la validation des paquets utilise package.LoadOptions, tandis que la validation Flat utilise OdfValidationOptions.LoadOptions (la valeur par défaut de 64 MiB de OdfLoadOptions en cas d’omission). Les signatures, horodatages, données de révocation de certificat et réponses réseau externes ont leurs propres limites, plus petites ; la limite du paquet principal ne les remplace pas. Pour les règles de contenu, utilisez OdfPackageValidator, SanitizeMacros, la validation des signatures ou pwsh eng/Test-OdfPolicy.ps1.
Autres protections des ressources et de la sortie
Outre les limites du paquet et des lecteurs en flux, les limites fixes suivantes protègent aussi contre les entrées non fiables. Ces valeurs sont actuellement des constantes fixes dans le code ; elles ne sont pas encore configurables via OdfLoadOptions ou un objet d'options. Évaluez l'impact sur la mémoire et la pile avant d'augmenter ou de supprimer une limite.
| Aspect | Limite | Comportement en cas de dépassement |
|---|---|---|
| Taille décompressée réelle d'une entrée ZIP | Ne doit pas dépasser la taille non compressée déclarée dans l'en-tête (chemin MMF du chargement par chemin de fichier) | SecurityException |
| Répertoire central ZIP endommagé ou ZIP64 | Le chemin rapide MMF ne prend pas en charge ZIP64, et aucun enregistrement impossible à analyser entièrement ne doit être ignoré en silence | Repli sur la validation et la lecture via ZipArchive |
| Profondeur d'imbrication des éléments XML | 256 niveaux (OdfXmlReader.MaxElementDepth) ; s'applique au chargement DOM, au chargement Flat ODF, à la validation des règles de profil et à l'analyse RDF |
Le chargement lève SecurityException ; la validation signale ODF0303 ou ODF0301 |
| Profondeur d'imbrication de l'analyse des formules | 256 niveaux chacun pour les parenthèses, les arguments de fonction, les tableaux en ligne et les opérateurs préfixes consécutifs | InvalidOperationException |
| Nombre total de nœuds d'opérateur d'une formule | 4 096 (FormulaParser.MaxOperatorNodes) ; opérateurs binaires, unaires, de pourcentage et de référence cumulés. Les formules chaînées forment des arbres profonds à gauche dont l'évaluation et la sérialisation récursent niveau par niveau ; cette limite garantit qu'une pile de thread ordinaire suffit |
InvalidOperationException |
| Marge de pile de la récursion des formules | L'analyse, l'évaluation, la récupération des plages et la sérialisation vérifient la pile restante (RuntimeHelpers.EnsureSufficientExecutionStack) avant d'entrer dans chaque niveau de récursion ; même les formules proches des limites ne font pas planter le processus sur des threads à petite pile de 128–256 Ko |
InsufficientExecutionStackException ; EvaluateFormulas la convertit en exception d'évaluation de formule ou en #VALUE! |
| Longueur du résultat texte d'une formule | 1 048 576 caractères (&, résultats de fonctions, SUBSTITUTE, REPT) |
Renvoie #VALUE! |
| Fonctions de formule dont la borne de boucle est un argument | BINOMDIST cumul 100 000 ; CRITBINOM, HYPGEOMDIST cumul 100 000 ; POISSON cumul 1 000 000 ; DB, DDB, VDB, CUMIPMT périodes 1 000 000 |
Renvoie #NUM! |
| Indice de ligne/colonne de la feuille de calcul | Ligne 1 048 575, colonne 16 383 (OdfSpreadsheetLimits) |
ArgumentOutOfRangeException |
| Ajout de document | Un document ne peut pas être ajouté à lui-même | ArgumentException |
Collaboration addColumns |
Limité par le nombre de colonnes et le nombre total de cellules de OdtOperationSafetyOptions |
Journalise la limite de sécurité et ignore l'opération |
| Image de secours du graphique | 4 096 px par côté | Ramenée à la limite |
| Format de conversion LibreOffice | La partie d'extension avant les deux-points ne doit pas être vide ni contenir .., NUL, CR ou LF |
ArgumentException |
| Requête SPARQL | Les clauses SERVICE ne sont pas autorisées (empêche le moteur de requêtes d'envoyer des requêtes réseau vers des points de terminaison arbitraires) |
ArgumentException |
Limites des lecteurs en continu
| Lecteur | Limite | Valeur par défaut |
|---|---|---|
| ODS | Caractères XML | 64 MiB |
| ODS | Lignes par feuille | 1,048,576 |
| ODS | Colonnes par ligne | 16,384 |
| ODS | Une déclaration repeat | lignes 1,048,576 ; colonnes 16,384 |
| ODS | Texte extrait d’une cellule | 16 MiB |
| ODT | Caractères XML | 64 MiB |
| ODT | Nœuds texte renvoyés | 1,000,000 |
| ODT | Texte extrait d’un nœud | 16 MiB |
La lecture échoue lorsqu’une limite est dépassée ; elle ne tronque pas repeat pour renvoyer des données apparemment complètes. Ne relancez pas automatiquement sans limites.
LeaveOpen vaut false par défaut. Avec true, la suppression du lecteur ferme le flux d’entrée XML et
le lecteur ZIP, mais laisse ouvert le flux externe fourni par l’appelant.
Conservez les limites par défaut pour les documents non fiables et validez d’abord le paquet et le schéma.
Augmenter les limites XML ou de texte accroît aussi les risques mémoire et CPU DoS.
MaxXmlCharactersInDocument = 0 ne désactive que la limite de caractères XML. Les limites, la validation
et l’assainissement réduisent les risques sans garantir une sécurité absolue contre les documents malveillants.
Les options des lecteurs ODS et ODT valident les règles lors de l’affectation : la limite XML accepte zéro, tandis que les limites de lignes, colonnes, repeat, nœuds et texte doivent être supérieures à zéro.