CA2361: verifique se a classe gerada automaticamente que contém DataSet.ReadXml() não é usada quando os dados não são confiáveis
Property | Valor |
---|---|
ID da regra | CA2361 |
Título | verifique se a classe gerada automaticamente que contém DataSet.ReadXml() não é usada quando os dados não são confiáveis |
Categoria | Segurança |
Correção interruptiva ou sem interrupção | Sem interrupção |
Habilitado por padrão no .NET 8 | Não |
Causa
O método DataSet.ReadXml foi chamado ou referenciado e está no código gerado automaticamente.
Essa regra classifica o código gerado automaticamente b:
- Estar dentro de um método chamado
ReadXmlSerializable
. - O método
ReadXmlSerializable
tem um System.Diagnostics.DebuggerNonUserCodeAttribute. - O método
ReadXmlSerializable
está dentro de um tipo que tem um System.ComponentModel.DesignerCategoryAttribute.
CA2351 é uma regra semelhante, para quando DataSet.ReadXml aparece dentro do código não gerado automaticamente.
Descrição da regra
Quando você desserializa um DataSet com entrada não confiável, um invasor pode criar uma entrada mal-intencionada para executar um ataque de negação de serviço. Pode haver vulnerabilidades de execução de código remoto desconhecidas.
Essa regra é como CA2351, mas para código gerado automaticamente para uma representação na memória de dados em um aplicativo de GUI. Normalmente, essas classes geradas automaticamente não são desserializadas de entrada não confiável. O uso do seu aplicativo pode variar.
Para obter mais informações, consulte Diretrizes de segurança do DataSet e do DataTable.
Como corrigir violações
- Se possível, use o Entity Framework em vez do DataSet.
- Torne os dados serializados à prova de adulteração. Após a serialização, assine criptograficamente os dados serializados. Antes da desserialização, valide a assinatura criptográfica. Proteja a chave criptográfica para impedir que ela seja divulgada e projete rotações de chave.
Quando suprimir avisos
É seguro suprimir um aviso dessa regra se:
- Você souber que a entrada é confiável. Considere que o limite de confiança do seu aplicativo e os fluxos de dados podem ser alterados ao longo do tempo.
- Você tiver tomado uma das precauções descritas em Como corrigir violações.
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 CA2361
// The code that's violating the rule is on this line.
#pragma warning restore CA2361
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.CA2361.severity = none
Para obter mais informações, confira Como suprimir avisos de análise de código.
Exemplos de pseudocódigo
Violação
namespace ExampleNamespace
{
/// <summary>
///Represents a strongly typed in-memory cache of data.
///</summary>
[global::System.Serializable()]
[global::System.ComponentModel.DesignerCategoryAttribute("code")]
[global::System.ComponentModel.ToolboxItem(true)]
[global::System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedDataSetSchema")]
[global::System.Xml.Serialization.XmlRootAttribute("Package")]
[global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.DataSet")]
public partial class Something : global::System.Data.DataSet {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
protected override void ReadXmlSerializable(global::System.Xml.XmlReader reader) {
if ((this.DetermineSchemaSerializationMode(reader) == global::System.Data.SchemaSerializationMode.IncludeSchema)) {
this.Reset();
global::System.Data.DataSet ds = new global::System.Data.DataSet();
ds.ReadXml(reader);
if ((ds.Tables["Something"] != null)) {
base.Tables.Add(new SomethingTable(ds.Tables["Something"]));
}
this.DataSetName = ds.DataSetName;
this.Prefix = ds.Prefix;
this.Namespace = ds.Namespace;
this.Locale = ds.Locale;
this.CaseSensitive = ds.CaseSensitive;
this.EnforceConstraints = ds.EnforceConstraints;
this.Merge(ds, false, global::System.Data.MissingSchemaAction.Add);
this.InitVars();
}
else {
this.ReadXml(reader);
this.InitVars();
}
}
}
}
Regras relacionadas
CA2350: verifique se a entrada do DataTable.ReadXml() é confiável
CA2351: verifique se a entrada do DataSet.ReadXml() é confiável
CA2353: DataSet ou DataTable não seguros no tipo serializável
CA2355: DataSet ou DataTable não seguros no grafo de objetos desserializados
CA2356: DataSet ou DataTable não seguro no grafo de objetos desserializados da Web