目錄 / Table of Contents

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

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

O carregamento de pacotes e OdsStreamReader/OdtStreamReader processam entradas ZIP/XML não confiáveis. Os Readers não criam o DOM completo do documento, mas alocam buffers para a linha atual, o texto dos nós, a descompactação ZIP e o XML Reader. Um projeto de baixa residência não elimina os efeitos do tamanho da entrada.

Limites do pacote principal

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

Limite Valor padrão Proteção
Entradas ZIP 5,000 Evita esgotamento de CPU e memória por muitas entradas pequenas
Tamanho descompactado de uma entrada 500 MiB Limita a expansão de uma entrada ZIP
Tamanho descompactado 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 em um documento XML 64 MiB Limita a análise XML e a criação do DOM

Os quatro limites ZIP devem ser positivos; zero ou valores negativos geram imediatamente ArgumentOutOfRangeException. Somente MaxXmlCharactersInDocument = 0 desativa o limite XML. Todos os XML Readers devem proibir DTD e resolvers externos. Novos caminhos devem reutilizar OdfLoadOptions. Os caminhos de validação de pacotes e Flat XML (OdfPackageValidator, OdfFlatDocumentValidator e varreduras de regras de perfil) também aplicam MaxXmlCharactersInDocument: a validação de pacotes usa package.LoadOptions, enquanto a validação Flat usa OdfValidationOptions.LoadOptions (o padrão de 64 MiB de OdfLoadOptions quando omitido). Assinaturas, carimbos de data/hora, dados de revogação de certificados e respostas de rede externas têm limites próprios menores; 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.

Limites dos leitores em fluxo

Reader Limite Valor padrão
ODS Caracteres XML 64 MiB
ODS Linhas por planilha 1,048,576
ODS Colunas por linha 16,384
ODS Uma declaração repeat 1,048,576 linhas; 16,384 colunas
ODS Texto extraído de uma célula 16 MiB
ODT Caracteres XML 64 MiB
ODT Nós de texto retornados 1,000,000
ODT Texto extraído de um nó 16 MiB

A leitura falha quando um limite é excedido; repeat não é truncado para continuar retornando dados que pareçam completos. Trate essas falhas como resultados da proteção de recursos e não tente novamente de forma automática com os limites desativados.

Propriedade dos fluxos

O valor padrão de LeaveOpen nas opções é false. Quando definido como true, o descarte do Reader ainda fecha o fluxo da entrada XML e o ZIP Reader, mas mantém aberto o fluxo mais externo fornecido pelo chamador.

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. Esses valores são atualmente constantes fixas no código e ainda não podem ser configurados por meio 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.

Aspecto Limite Comportamento ao exceder
Tamanho descompactado real de uma entrada ZIP Não pode exceder o tamanho não compactado declarado no cabeçalho (caminho MMF do carregamento por caminho de arquivo) SecurityException
Diretório central ZIP danificado ou ZIP64 O caminho rápido MMF não oferece suporte a ZIP64 e nenhum registro que não possa ser totalmente analisado pode ser ignorado silenciosamente Recorre à validação e leitura por meio 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 informa 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 porcentagem e de referência somados. Fórmulas encadeadas formam árvores profundas à esquerda cuja avaliação e serialização recursam nível a nível; esse limite garante que uma pilha de thread comum seja 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 fórmulas próximas dos limites não derrubam o processo em threads com pilha pequena de 128–256 KB InsufficientExecutionStackException; EvaluateFormulas a converte em uma exceção de avaliação de fórmula ou em #VALUE!
Comprimento do resultado de texto de uma fórmula 1.048.576 caracteres (&, resultados de funções, SUBSTITUTE, REPT) Retorna #VALUE!
Funções de fórmula cujo limite de laço é 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 Retorna #NUM!
Índice de linha/coluna da planilha Linha 1.048.575, coluna 16.383 (OdfSpreadsheetLimits) ArgumentOutOfRangeException
Anexação de documentos Um documento não pode ser anexado a si mesmo ArgumentException
Collaboration addColumns Limitado pelo número de colunas e pelo total de células de OdtOperationSafetyOptions Registra 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 Cláusulas SERVICE não são permitidas (impede que o mecanismo de consulta envie solicitações de rede a endpoints arbitrários) ArgumentException

Limite de confiança

Mantenha os limites padrão para documentos não confiáveis e execute primeiro a validação de package e schema. É possível aumentar limites específicos para documentos grandes confiáveis que realmente precisem ser processados, mas o aumento dos limites de XML ou texto também eleva o risco de ataques à memória e de CPU DoS. MaxXmlCharactersInDocument = 0 desativa apenas o limite de caracteres XML; os demais limites do Reader continuam válidos.

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

Os limites de segurança, a validação e a sanitização reduzem o risco, mas não garantem segurança absoluta contra documentos maliciosos.