Compartilhar via


CA3077: Processamento não seguro no design de API, no documento XML e no leitor de texto XML

Property Valor
ID da regra CA3077
Título Processamento não seguro no design de API, no documento XML e no leitor de texto XML
Categoria Segurança
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 8 Não

Causa

Ao criar uma API derivada de XMLDocument e de XMLTextReader, tenha atenção quanto a DtdProcessing. Usar instâncias de DTDProcessing não seguras ao referenciar ou resolver fontes de entidade externas ou definir valores não seguros no XML pode levar à divulgação de informações.

Descrição da regra

Uma definição de tipo de documento (DTD) é uma das duas maneiras pelas quais um analisador XML pode determinar a validade de um documento, conforme definido pela XML (linguagem XML) do World Wide Web Consortium (W3C) 1.0. Essa regra busca propriedades e instâncias em que dados não confiáveis são aceitos para alertar os desenvolvedores sobre possíveis ameaças de divulgação não autorizada de informação o que pode levar a ataques de DoS (Negação de Serviço). Essa regra dispara quando:

  • As classes XmlDocument ou XmlTextReader usam valores padrão de resolvedor para processamento de DTD.

  • Nenhum construtor é definido para as classes derivadas de XmlDocument ou XmlTextReader ou nenhum valor seguro é usado para XmlResolver.

Como corrigir violações

  • Capture e processe todas as exceções de XmlTextReader corretamente para evitar a divulgação de informações de caminho.

  • Use XmlSecureResolver em vez de XmlResolver para restringir os recursos que o XmlTextReader pode acessar.

Quando suprimir avisos

A menos que você tenha certeza de que se sabe que a entrada vem de uma fonte confiável, não suprima uma regra desse aviso.

Suprimir um aviso

Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar a regra.

#pragma warning disable CA3077
// The code that's violating the rule is on this line.
#pragma warning restore CA3077

Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade como none no arquivo de configuração.

[*.{cs,vb}]
dotnet_diagnostic.CA3077.severity = none

Para obter mais informações, confira Como suprimir avisos de análise de código.

Exemplos de pseudocódigo

Violação

using System;
using System.Xml;

namespace TestNamespace
{
    class TestClass : XmlDocument
    {
        public TestClass () {} // warn
    }

    class TestClass2 : XmlTextReader
    {
        public TestClass2() // warn
        {
        }
    }
}

Solução

using System;
using System.Xml;

namespace TestNamespace
{
    class TestClass : XmlDocument
    {
        public TestClass ()
        {
            XmlResolver = null;
        }
    }

    class TestClass2 : XmlTextReader
    {
        public TestClass2()
        {
               XmlResolver = null;
        }
    }
}