CA2322: Garantir que o JavaScriptSerializer não seja inicializado com SimpleTypeResolver antes de desserializarCA2322: Ensure JavaScriptSerializer is not initialized with SimpleTypeResolver before deserializing

ValorValue
ID da regraRule ID CA2322CA2322
CategoriaCategory SegurançaSecurity
A correção está sendo interrompida ou não está sendo interrompidaFix is breaking or non-breaking Sem interrupçãoNon-breaking

CausaCause

Um System.Web.Script.Serialization.JavaScriptSerializer método de desserialização foi chamado ou referenciado e o JavaScriptSerializer pode ter sido inicializado com um System.Web.Script.Serialization.SimpleTypeResolver .A System.Web.Script.Serialization.JavaScriptSerializer deserialization method was called or referenced and the JavaScriptSerializer may have been initialized with a System.Web.Script.Serialization.SimpleTypeResolver.

Por padrão, essa regra analisa toda a base de código, mas é configurável.By default, this rule analyzes the entire codebase, but this is configurable.

Descrição da regraRule description

Desserializadores inseguros são vulneráveis ao desserializar dados não confiáveis.Insecure deserializers are vulnerable when deserializing untrusted data. Um invasor pode modificar os dados serializados para incluir tipos inesperados para injetar objetos com efeitos colaterais mal-intencionados.An attacker could modify the serialized data to include unexpected types to inject objects with malicious side effects. Um ataque contra um desserializador inseguro pode, por exemplo, executar comandos no sistema operacional subjacente, comunicar-se pela rede ou excluir arquivos.An attack against an insecure deserializer could, for example, execute commands on the underlying operating system, communicate over the network, or delete files.

Essa regra localiza System.Web.Script.Serialization.JavaScriptSerializer chamadas ou referências do método de desserialização, quando o JavaScriptSerializer pode ter sido inicializado com um System.Web.Script.Serialization.SimpleTypeResolver .This rule finds System.Web.Script.Serialization.JavaScriptSerializer deserialization method calls or references, when the JavaScriptSerializer may have been initialized with a System.Web.Script.Serialization.SimpleTypeResolver.

Como corrigir violaçõesHow to fix violations

  • Certifique-se de que os JavaScriptTypeResolver objetos não sejam inicializados com um System.Web.Script.Serialization.SimpleTypeResolver .Ensure JavaScriptTypeResolver objects aren't initialized with a System.Web.Script.Serialization.SimpleTypeResolver.
  • Se seu código precisar ler dados serializados usando um SimpleTypeResolver , restrinja os tipos desserializados para uma lista esperada implementando um personalizado JavaScriptTypeResolver .If your code needs to read data serialized using a SimpleTypeResolver, restrict deserialized types to an expected list by implementing a custom JavaScriptTypeResolver.
  • Torne a prova de adulteração dos dados serializados.Make the serialized data tamper-proof. Após a serialização, assine criptograficamente os dados serializados.After serialization, cryptographically sign the serialized data. Antes da desserialização, valide a assinatura criptográfica.Before deserialization, validate the cryptographic signature. Proteja a chave de criptografia de ser divulgada e design para rotações de chave.Protect the cryptographic key from being disclosed and design for key rotations.

Quando suprimir avisosWhen to suppress warnings

É seguro suprimir um aviso dessa regra se:It's safe to suppress a warning from this rule if:

  • Você sabe que a entrada é confiável.You know the input is trusted. Considere que o limite de confiança do seu aplicativo e os fluxos de dados podem mudar ao longo do tempo.Consider that your application's trust boundary and data flows may change over time.
  • Você tomou uma das precauções em como corrigir violações.You've taken one of the precautions in How to fix violations.

Configurar o código para analisarConfigure code to analyze

Use as opções a seguir para configurar em quais partes de sua base de código executar essa regra.Use the following options to configure which parts of your codebase to run this rule on.

Você pode configurar essas opções apenas para essa regra, para todas as regras ou para todas as regras nesta categoria (segurança).You can configure these options for just this rule, for all rules, or for all rules in this category (Security). Para obter mais informações, consulte Opções de configuração de regra de qualidade de código.For more information, see Code quality rule configuration options.

Excluir símbolos específicosExclude specific symbols

Você pode excluir símbolos específicos, como tipos e métodos, da análise.You can exclude specific symbols, such as types and methods, from analysis. Por exemplo, para especificar que a regra não deve ser executada em nenhum código dentro de tipos nomeados MyType , adicione o seguinte par chave-valor a um arquivo . editorconfig em seu projeto:For example, to specify that the rule should not run on any code within types named MyType, add the following key-value pair to an .editorconfig file in your project:

dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType

Formatos de nome de símbolo permitidos no valor de opção (separados por | ):Allowed symbol name formats in the option value (separated by |):

  • Somente nome do símbolo (inclui todos os símbolos com o nome, independentemente do tipo ou namespace que o contém).Symbol name only (includes all symbols with the name, regardless of the containing type or namespace).
  • Nomes totalmente qualificados no formato de ID de documentaçãodo símbolo.Fully qualified names in the symbol's documentation ID format. Cada nome de símbolo requer um prefixo de tipo de símbolo, como M: para métodos, T: para tipos e N: para namespaces.Each symbol name requires a symbol-kind prefix, such as M: for methods, T: for types, and N: for namespaces.
  • .ctor para construtores e .cctor para construtores estáticos..ctor for constructors and .cctor for static constructors.

Exemplos:Examples:

Valor de OpçãoOption Value ResumoSummary
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType Corresponde a todos os símbolos chamados MyType .Matches all symbols named MyType.
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 Corresponde a todos os símbolos nomeados MyType1 ou MyType2 .Matches all symbols named either MyType1 or MyType2.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) Corresponde ao método específico MyMethod com a assinatura totalmente qualificada especificada.Matches specific method MyMethod with the specified fully qualified signature.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) O corresponde a métodos específicos MyMethod1 e MyMethod2 com as respectivas assinaturas totalmente qualificadas.Matches specific methods MyMethod1 and MyMethod2 with the respective fully qualified signatures.

Excluir tipos específicos e seus tipos derivadosExclude specific types and their derived types

Você pode excluir tipos específicos e seus tipos derivados da análise.You can exclude specific types and their derived types from analysis. Por exemplo, para especificar que a regra não deve ser executada em nenhum método em tipos nomeados MyType e seus tipos derivados, adicione o seguinte par chave-valor a um arquivo . editorconfig em seu projeto:For example, to specify that the rule should not run on any methods within types named MyType and their derived types, add the following key-value pair to an .editorconfig file in your project:

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType

Formatos de nome de símbolo permitidos no valor de opção (separados por | ):Allowed symbol name formats in the option value (separated by |):

  • Somente nome de tipo (inclui todos os tipos com o nome, independentemente do tipo ou namespace que o contém).Type name only (includes all types with the name, regardless of the containing type or namespace).
  • Nomes totalmente qualificados no formato de ID de documentaçãodo símbolo, com um T: prefixo opcional.Fully qualified names in the symbol's documentation ID format, with an optional T: prefix.

Exemplos:Examples:

Valor de OpçãoOption Value ResumoSummary
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType Corresponde a todos os tipos chamados MyType e todos os seus tipos derivados.Matches all types named MyType and all of their derived types.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 Corresponde a todos os tipos chamados MyType1 ou MyType2 e todos os seus tipos derivados.Matches all types named either MyType1 or MyType2 and all of their derived types.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType Corresponde ao tipo específico MyType com o nome totalmente qualificado fornecido e todos os seus tipos derivados.Matches specific type MyType with given fully qualified name and all of its derived types.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 Faz a correspondência MyType1 de tipos específicos e MyType2 com os respectivos nomes totalmente qualificados e todos os seus tipos derivados.Matches specific types MyType1 and MyType2 with the respective fully qualified names, and all of their derived types.

Exemplos de pseudocódigoPseudo-code examples

Violação 1Violation 1

using System.Web.Script.Serialization;

public class ExampleClass
{
    public JavaScriptSerializer Serializer { get; set; }

    public T Deserialize<T>(string str)
    {
        return this.Serializer.Deserialize<T>(str);
    }
}
Imports System.Web.Script.Serialization

Public Class ExampleClass
    Public Property Serializer As JavaScriptSerializer

    Public Function Deserialize(Of T)(str As String) As T
        Return Me.Serializer.Deserialize(Of T)(str)
    End Function
End Class

Solução 1Solution 1

using System.Web.Script.Serialization;

public class ExampleClass
{
    public T Deserialize<T>(string str)
    {
        JavaScriptSerializer s = new JavaScriptSerializer();
        return s.Deserialize<T>(str);
    }
}
Imports System.Web.Script.Serialization

Public Class ExampleClass
    Public Function Deserialize(Of T)(str As String) As T
        Dim s As JavaScriptSerializer = New JavaScriptSerializer()
        Return s.Deserialize(Of T)(str)
    End Function
End Class

Violação 2Violation 2

using System.Web.Script.Serialization;

public class BookRecord
{
    public string Title { get; set; }
    public string Author { get; set; }
    public int PageCount { get; set; }
    public AisleLocation Location { get; set; }
}

public class AisleLocation
{
    public char Aisle { get; set; }
    public byte Shelf { get; set; }
}

public class ExampleClass
{
    public JavaScriptSerializer Serializer { get; set; }

    public BookRecord DeserializeBookRecord(string s)
    {
        return this.Serializer.Deserialize<BookRecord>(s);
    }
}
Imports System.Web.Script.Serialization

Public Class BookRecord
    Public Property Title As String
    Public Property Author As String
    Public Property Location As AisleLocation
End Class

Public Class AisleLocation
    Public Property Aisle As Char
    Public Property Shelf As Byte
End Class

Public Class ExampleClass
    Public Property Serializer As JavaScriptSerializer

    Public Function DeserializeBookRecord(str As String) As BookRecord
        Return Me.Serializer.Deserialize(Of BookRecord)(str)
    End Function
End Class

Solução 2Solution 2

using System;
using System.Web.Script.Serialization;

public class BookRecordTypeResolver : JavaScriptTypeResolver
{
    // For compatibility with data serialized with a JavaScriptSerializer initialized with SimpleTypeResolver.
    private static readonly SimpleTypeResolver Simple = new SimpleTypeResolver();

    public override Type ResolveType(string id)
    {
        // One way to discover expected types is through testing deserialization
        // of **valid** data and logging the types used.

        ////Console.WriteLine($"ResolveType('{id}')");

        if (id == typeof(BookRecord).AssemblyQualifiedName || id == typeof(AisleLocation).AssemblyQualifiedName)
        {
            return Simple.ResolveType(id);
        }
        else
        {
            throw new ArgumentException("Unexpected type ID", nameof(id));
        }
    }

    public override string ResolveTypeId(Type type)
    {
        return Simple.ResolveTypeId(type);
    }
}

public class BookRecord
{
    public string Title { get; set; }
    public string Author { get; set; }
    public int PageCount { get; set; }
    public AisleLocation Location { get; set; }
}

public class AisleLocation
{
    public char Aisle { get; set; }
    public byte Shelf { get; set; }
}

public class ExampleClass
{
    public BookRecord DeserializeBookRecord(string s)
    {
        JavaScriptSerializer serializer = new JavaScriptSerializer(new BookRecordTypeResolver());
        return serializer.Deserialize<BookRecord>(s);
    }
}
Imports System
Imports System.Web.Script.Serialization

Public Class BookRecordTypeResolver
    Inherits JavaScriptTypeResolver

    ' For compatibility with data serialized with a JavaScriptSerializer initialized with SimpleTypeResolver.
    Private Dim Simple As SimpleTypeResolver = New SimpleTypeResolver()

    Public Overrides Function ResolveType(id As String) As Type
        ' One way to discover expected types is through testing deserialization
        ' of **valid** data and logging the types used.

        ''Console.WriteLine($"ResolveType('{id}')")

        If id = GetType(BookRecord).AssemblyQualifiedName Or id = GetType(AisleLocation).AssemblyQualifiedName Then
            Return Simple.ResolveType(id)
        Else
            Throw New ArgumentException("Unexpected type", NameOf(id))
        End If
    End Function

    Public Overrides Function ResolveTypeId(type As Type) As String
        Return Simple.ResolveTypeId(type)
    End Function
End Class

Public Class BookRecord
    Public Property Title As String
    Public Property Author As String
    Public Property Location As AisleLocation
End Class

Public Class AisleLocation
    Public Property Aisle As Char
    Public Property Shelf As Byte
End Class

Public Class ExampleClass
    Public Function DeserializeBookRecord(str As String) As BookRecord
        Dim serializer As JavaScriptSerializer = New JavaScriptSerializer(New BookRecordTypeResolver())
        Return serializer.Deserialize(Of BookRecord)(str)
    End Function
End Class

CA2321: Não desserializar com JavaScriptSerializer usando um SimpleTypeResolverCA2321: Do not deserialize with JavaScriptSerializer using a SimpleTypeResolver