CA5369: Usar o XmlReader para desserializar
Property | Valor |
---|---|
ID da regra | CA5369 |
Título | Usar o XmlReader para desserializar |
Categoria | Segurança |
Correção interruptiva ou sem interrupção | Sem interrupção |
Habilitado por padrão no .NET 8 | Não |
Causa
A desserialização de entrada XML não confiável com XmlSerializer.Deserialize instanciado sem um objeto XmlReader
poderá resultar em ataques de negação de serviço, divulgação de informações e falsificação de solicitação do lado do servidor. Esses ataques são habilitados por DTD não confiável e processamento de esquema XML, o que permite a inclusão de bombas XML e entidades externas mal-intencionadas no XML. Somente com XmlReader
é possível desabilitar o DTD. O processamento de esquema XML embutido como XmlReader
tem a propriedade ProhibitDtd
e ProcessInlineSchema
definida como false
por padrão no .NET Framework versão 4.0 e posterior. As outras opções, como Stream
, TextReader
e XmlSerializationReader
não podem desabilitar o processamento de DTD.
Descrição da regra
O processamento de esquemas DTD e XML não confiáveis pode permitir o carregamento de referências externas perigosas, que devem ser restringidas usando um XmlReader
com um resolvedor seguro ou com o processamento de esquema em linha DTD e XML desabilitado. Essa regra detecta o código que usa o método XmlSerializer.Deserialize e não usa XmlReader
como parâmetro do construtor.
Como corrigir violações
Não use sobrecargas XmlSerializer.Deserialize diferentes de Deserialize(XmlReader), Deserialize(XmlReader, String), Deserialize(XmlReader, XmlDeserializationEvents) ou Deserialize(XmlReader, String, XmlDeserializationEvents).
Quando suprimir avisos
Você pode potencialmente suprimir esse aviso se o XML analisado vier de uma fonte confiável e, portanto, não puder ser adulterado.
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 CA5369
// The code that's violating the rule is on this line.
#pragma warning restore CA5369
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.CA5369.severity = none
Para obter mais informações, confira Como suprimir avisos de análise de código.
Exemplos de pseudocódigo
Violação
O exemplo de pseudocódigo a seguir ilustra o padrão detectado por essa regra.
O tipo do primeiro parâmetro de XmlSerializer.Deserialize não é XmlReader
ou uma classe derivada dele.
using System.IO;
using System.Xml.Serialization;
...
new XmlSerializer(typeof(TestClass).Deserialize(new FileStream("filename", FileMode.Open));
Solução
using System.IO;
using System.Xml;
using System.Xml.Serialization;
...
new XmlSerializer(typeof(TestClass)).Deserialize(XmlReader.Create (new FileStream("filename", FileMode.Open)));