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:
DtdProcessing está habilitado XmlReader na instância, que resolve entidades XML externas usando XmlUrlResolver.
A InnerXml propriedade no XML está definida.
DtdProcessing property está definida como Parse.
A entrada não confiável é processada usando XmlResolver em vez de XmlSecureResolver.
O XmlReader.Create método é invocado com uma instância insegura XmlReaderSettings ou nenhuma instância.
XmlReader é criado com configurações ou valores padrão inseguros.
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.