目錄 / Table of Contents

Limites de segurança do carregamento e dos leitores de fluxo

Tradução informativa; em caso de divergência, prevalece a fonte zh-TW.

O carregamento de pacotes e OdsStreamReader/OdtStreamReader processam entradas ZIP/XML não fiáveis. Os leitores não criam o DOM completo, mas alocam buffers para a linha atual, texto dos nós, descompressão ZIP e leitor XML. Baixa residência não elimina o efeito do tamanho da entrada.

Limites do pacote principal

OdfDocument.Load, as fachadas Load e OdfPackage.Open partilham os orçamentos de OdfLoadOptions.

Limite Predefinição Proteção
Entradas ZIP 5,000 Evita esgotar CPU e memória com muitas entradas pequenas
Tamanho descomprimido de uma entrada 500 MiB Limita a expansão de uma entrada ZIP
Tamanho descomprimido total 1 GiB Limita a expansão total do pacote
Entrada bruta não pesquisável 1 GiB Limita o buffer antes da expansão ZIP
Caracteres num documento XML 64 MiB Limita a análise XML e a criação do DOM

Os quatro limites ZIP têm de ser positivos; zero ou valores negativos geram imediatamente ArgumentOutOfRangeException. Apenas MaxXmlCharactersInDocument = 0 desativa o limite XML. Todos os leitores XML devem proibir DTD e resolvers externos. Novos caminhos devem reutilizar OdfLoadOptions. Os caminhos de validação de pacotes e Flat XML (OdfPackageValidator, OdfFlatDocumentValidator e análise das regras de perfil) também aplicam MaxXmlCharactersInDocument: a validação de pacotes usa package.LoadOptions, enquanto a validação Flat usa OdfValidationOptions.LoadOptions (a predefinição de 64 MiB de OdfLoadOptions quando omitida). Assinaturas, carimbos de data e hora, dados de revogação de certificados e respostas de rede externas têm limites próprios mais pequenos; o limite do pacote principal não os substitui. Para políticas de conteúdo use OdfPackageValidator, SanitizeMacros, validação de assinaturas ou pwsh eng/Test-OdfPolicy.ps1.

Outras proteções de recursos e de saída

Além dos limites do pacote e dos leitores de streaming, os seguintes limites fixos também protegem contra entradas não confiáveis. Estes valores são atualmente constantes fixas no código e ainda não podem ser configurados através de OdfLoadOptions ou de um objeto de opções. Avalie o impacto na memória e na pilha antes de aumentar ou remover um limite.

Aspeto Limite Comportamento ao exceder
Tamanho descomprimido real de uma entrada ZIP Não pode exceder o tamanho não comprimido declarado no cabeçalho (caminho MMF do carregamento por caminho de ficheiro) SecurityException
Diretório central ZIP danificado ou ZIP64 O caminho rápido MMF não suporta ZIP64 e nenhum registo que não possa ser totalmente analisado pode ser ignorado em silêncio Recorre à validação e leitura através de ZipArchive
Profundidade de aninhamento de elementos XML 256 níveis (OdfXmlReader.MaxElementDepth); aplica-se ao carregamento DOM, ao carregamento de Flat ODF, à validação de regras de perfil e à análise RDF O carregamento lança SecurityException; a validação comunica ODF0303 ou ODF0301
Profundidade de aninhamento na análise de fórmulas 256 níveis cada para parênteses, argumentos de função, matrizes em linha e operadores prefixo consecutivos InvalidOperationException
Total de nós de operador de uma fórmula 4.096 (FormulaParser.MaxOperatorNodes); operadores binários, unários, de percentagem e de referência em conjunto. As fórmulas encadeadas formam árvores profundas à esquerda cuja avaliação e serialização recursam nível a nível; este limite garante que uma pilha de thread normal é suficiente InvalidOperationException
Margem de pilha na recursão de fórmulas A análise, a avaliação, a obtenção de intervalos e a serialização verificam a pilha restante (RuntimeHelpers.EnsureSufficientExecutionStack) antes de entrar em cada nível de recursão; mesmo as fórmulas próximas dos limites não bloqueiam o processo em threads com pilha pequena de 128–256 KB InsufficientExecutionStackException; EvaluateFormulas converte-a numa exceção de avaliação de fórmula ou em #VALUE!
Comprimento do resultado de texto de uma fórmula 1.048.576 carateres (&, resultados de funções, SUBSTITUTE, REPT) Devolve #VALUE!
Funções de fórmula cujo limite de ciclo é um argumento BINOMDIST acumulado 100.000; CRITBINOM, HYPGEOMDIST acumulado 100.000; POISSON acumulado 1.000.000; DB, DDB, VDB, CUMIPMT períodos 1.000.000 Devolve #NUM!
Índice de linha/coluna da folha de cálculo Linha 1.048.575, coluna 16.383 (OdfSpreadsheetLimits) ArgumentOutOfRangeException
Anexação de documentos Um documento não pode ser anexado a si próprio ArgumentException
Collaboration addColumns Limitado pelo número de colunas e pelo total de células de OdtOperationSafetyOptions Regista o limite de segurança e ignora a operação
Imagem alternativa do gráfico 4.096 px por lado Limitada ao valor máximo
Formato de conversão do LibreOffice A parte da extensão antes dos dois pontos não pode estar vazia nem conter .., NUL, CR ou LF ArgumentException
Consulta SPARQL Não são permitidas cláusulas SERVICE (impede que o motor de consultas envie pedidos de rede para pontos finais arbitrários) ArgumentException

Limites dos leitores de fluxo

Leitor Limite Predefinição
ODS Caracteres XML 64 MiB
ODS Linhas por folha 1,048,576
ODS Colunas por linha 16,384
ODS Uma declaração repeat linhas 1,048,576; colunas 16,384
ODS Texto de uma célula 16 MiB
ODT Caracteres XML 64 MiB
ODT Nós de texto devolvidos 1,000,000
ODT Texto de um nó 16 MiB

Exceder um limite faz a leitura falhar; repeat não é truncado para devolver dados aparentemente completos. Não repita automaticamente sem limites. LeaveOpen é false; com true, o fluxo XML e o leitor ZIP são fechados, mas o fluxo exterior do chamador permanece aberto.

Mantenha os limites para documentos não fiáveis e valide pacote e esquema. Aumentá-los eleva riscos de memória e CPU DoS. MaxXmlCharactersInDocument = 0 desativa apenas o limite XML. Limites, validação e sanitização reduzem riscos, mas não garantem segurança absoluta.

As opções dos leitores ODS e ODT validam as regras ao atribuir propriedades: o limite XML aceita zero, enquanto os limites de linhas, colunas, repeat, nós e texto devem ser superiores a zero.