Partilhar via


CA3075: Processamento DTD inseguro

Property valor
ID da regra CA3075
Título Processamento DTD inseguro
Categoria Segurança
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 9 Não

Motivo

Se você usar instâncias inseguras DtdProcessing ou fazer referência a fontes de entidades externas, o analisador poderá aceitar entradas não confiáveis e divulgar informações confidenciais a invasores.

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 pelo World Wide Web Consortium (W3C) Extensible Markup Language (XML) 1.0. Esta regra procura propriedades e instâncias em que dados não confiáveis são aceitos para avisar os desenvolvedores sobre possíveis ameaças de divulgação de informações ou ataques de negação de serviço (DoS ). Esta regra é acionada quando:

Em cada um desses casos, o resultado é o mesmo: o conteúdo do sistema de arquivos ou compartilhamentos de rede da máquina onde o XML é processado será exposto ao invasor, ou o processamento DTD pode ser usado como um vetor DoS.

Como corrigir violações

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

  • Use o XmlSecureResolver para restringir os recursos que o XmlTextReader pode acessar.

  • Não permita que o XmlReader abra quaisquer recursos externos definindo a XmlResolver propriedade como null.

  • Certifique-se de que a propriedade é atribuída a DataViewManager.DataViewSettingCollectionString partir de uma fonte confiável.

.NET Framework 3.5 e versões anteriores

  • Desative o processamento DTD se estiver lidando com fontes não confiáveis definindo a ProhibitDtd propriedade como true.

  • A classe XmlTextReader tem uma demanda de herança de confiança total.

.NET Framework 4 e posterior

  • Evite ativar o DtdProcessing se estiver lidando com fontes não confiáveis definindo a XmlReaderSettings.DtdProcessing propriedade como Proibir ou Ignorar.

  • Certifique-se de que o método Load() usa uma instância XmlReader em todos os casos InnerXml.

Nota

Esta regra pode relatar falsos positivos em algumas instâncias válidas do XmlSecureResolver.

Quando suprimir avisos

A menos que você tenha certeza de que a entrada é conhecida por ser de uma fonte confiável, não suprima uma regra deste aviso.

Suprimir um aviso

Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar a regra.

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

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

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

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

Exemplos de pseudocódigo

Violação 1

using System.IO;
using System.Xml.Schema;

class TestClass
{
    public XmlSchema Test
    {
        get
        {
            var src = "";
            TextReader tr = new StreamReader(src);
            XmlSchema schema = XmlSchema.Read(tr, null); // warn
            return schema;
        }
    }
}

Solução 1

using System.IO;
using System.Xml;
using System.Xml.Schema;

class TestClass
{
    public XmlSchema Test
    {
        get
        {
            var src = "";
            TextReader tr = new StreamReader(src);
            XmlReader reader = XmlReader.Create(tr, new XmlReaderSettings() { XmlResolver = null });
            XmlSchema schema = XmlSchema.Read(reader , null);
            return schema;
        }
    }
}

Violação 2

using System.Xml;

namespace TestNamespace
{
    public class TestClass
    {
        public XmlReaderSettings settings = new XmlReaderSettings();
        public void TestMethod(string path)
        {
            var reader = XmlReader.Create(path, settings);  // warn
        }
    }
}

Solução 2

using System.Xml;

namespace TestNamespace
{
    public class TestClass
    {
        public XmlReaderSettings settings = new XmlReaderSettings()
        {
            DtdProcessing = DtdProcessing.Prohibit
        };

        public void TestMethod(string path)
        {
            var reader = XmlReader.Create(path, settings);
        }
    }
}

Violação 3

using System.Xml;

namespace TestNamespace
{
    public class DoNotUseSetInnerXml
    {
        public void TestMethod(string xml)
        {
            XmlDocument doc = new XmlDocument() { XmlResolver = null };
            doc.InnerXml = xml; // warn
        }
    }
}
using System.Xml;

namespace TestNamespace
{
    public class DoNotUseLoadXml
    {
        public void TestMethod(string xml)
        {
            XmlDocument doc = new XmlDocument(){ XmlResolver = null };
            doc.LoadXml(xml); // warn
        }
    }
}

Solução 3

using System.Xml;

public static void TestMethod(string xml)
{
    XmlDocument doc = new XmlDocument() { XmlResolver = null };
    System.IO.StringReader sreader = new System.IO.StringReader(xml);
    XmlReader reader = XmlReader.Create(sreader, new XmlReaderSettings() { XmlResolver = null });
    doc.Load(reader);
}

Violação 4

using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace TestNamespace
{
    public class UseXmlReaderForDeserialize
    {
        public void TestMethod(Stream stream)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(UseXmlReaderForDeserialize));
            serializer.Deserialize(stream); // warn
        }
    }
}

Solução 4

using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace TestNamespace
{
    public class UseXmlReaderForDeserialize
    {
        public void TestMethod(Stream stream)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(UseXmlReaderForDeserialize));
            XmlReader reader = XmlReader.Create(stream, new XmlReaderSettings() { XmlResolver = null });
            serializer.Deserialize(reader );
        }
    }
}

Violação 5

using System.Xml;
using System.Xml.XPath;

namespace TestNamespace
{
    public class UseXmlReaderForXPathDocument
    {
        public void TestMethod(string path)
        {
            XPathDocument doc = new XPathDocument(path); // warn
        }
    }
}

Solução 5

using System.Xml;
using System.Xml.XPath;

namespace TestNamespace
{
    public class UseXmlReaderForXPathDocument
    {
        public void TestMethod(string path)
        {
            XmlReader reader = XmlReader.Create(path, new XmlReaderSettings() { XmlResolver = null });
            XPathDocument doc = new XPathDocument(reader);
        }
    }
}

Violação 6

using System.Xml;

namespace TestNamespace
{
    class TestClass
    {
        public XmlDocument doc = new XmlDocument() { XmlResolver = new XmlUrlResolver() };
    }
}

Solução 6

using System.Xml;

namespace TestNamespace
{
    class TestClass
    {
        public XmlDocument doc = new XmlDocument() { XmlResolver = null }; // or set to a XmlSecureResolver instance
    }
}

Violação 7

using System.Xml;

namespace TestNamespace
{
    class TestClass
    {
        private static void TestMethod()
        {
            var reader = XmlTextReader.Create(""doc.xml""); //warn
        }
    }
}
using System.Xml;

namespace TestNamespace
{
    public class TestClass
    {
        public void TestMethod(string path)
        {
            try {
                XmlTextReader reader = new XmlTextReader(path); // warn
            }
            catch { throw ; }
            finally {}
        }
    }
}

Solução 7

using System.Xml;

namespace TestNamespace
{
    public class TestClass
    {
        public void TestMethod(string path)
        {
            XmlReaderSettings settings = new XmlReaderSettings() { XmlResolver = null };
            XmlReader reader = XmlReader.Create(path, settings);
        }
    }
}

Nota

Embora XmlReader.Create seja a maneira recomendada de criar uma XmlReader instância, há diferenças de comportamento do XmlTextReader. An XmlReader de Create normaliza \r\n para \n em valores XML, enquanto XmlTextReader preserva a \r\n sequência.