CA5369: Usar XmlReader para desserializar
Property | valor |
---|---|
ID da regra | CA5369 |
Título | Usar XmlReader para Desserializar |
Categoria | Segurança |
A correção está quebrando ou não quebrando | Sem quebra |
Habilitado por padrão no .NET 9 | Não |
Motivo
Desserializar entradas XML não confiáveis com XmlSerializer.Deserialize instanciado sem um XmlReader
objeto pode potencialmente levar a negação de serviço, divulgação de informações e ataques de 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. Apenas com XmlReader
é possível desativar o DTD. Processamento de esquema XML embutido como XmlReader
tem a ProhibitDtd
propriedade 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 desativar o processamento 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 restritas usando um XmlReader
com um resolvedor seguro ou com o processamento de esquema embutido DTD e XML desabilitado. Esta regra deteta o código que usa o XmlSerializer.Deserialize método e não toma XmlReader
como um parâmetro do construtor.
Como corrigir violações
Não utilize XmlSerializer.Deserialize sobrecargas que não Deserialize(XmlReader)sejam , 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
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 CA5369
// The code that's violating the rule is on this line.
#pragma warning restore CA5369
Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA5369.severity = none
Para obter mais informações, consulte 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 detetado por essa regra.
O tipo do primeiro parâmetro de não é XmlReader
ou uma classe derivada XmlSerializer.Deserialize deste.
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)));