Partilhar via


CA5369: Usar XmlReader para desserializar

Propriedade valor
ID da regra CA5369
Cargo Usar XmlReader para Desserializar
Categoria Segurança
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 8 Não

Causa

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 definida como false por padrão no .NET Framework versão 4.0 e ProcessInlineSchema posterior. As outras opções, como Stream, TextReadere 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 com um XmlReader 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)));