CA2326: Não usar valores de TypeNameHandling diferentes de None
Property | Valor |
---|---|
ID da regra | CA2326 |
Título | Não usar valores de TypeNameHandling diferentes de None |
Categoria | Segurança |
Correção interruptiva ou sem interrupção | Sem interrupção |
Habilitado por padrão no .NET 9 | Não |
Causa
Essa regra será acionada quando uma das seguintes condições for atendida:
- Um valor de enumeração Newtonsoft.Json.TypeNameHandling, diferente de
None
, é referenciado. - Um valor inteiro que representa um valor não zero é atribuído a uma variável TypeNameHandling.
Descrição da regra
Desserializadores não seguros são vulneráveis ao desserializar dados não confiáveis. Um invasor pode modificar os dados serializados visando incluir tipos inesperados para injetar objetos com efeitos colaterais mal-intencionados. Um ataque contra um desserializador não seguro poderia, por exemplo, executar comandos no sistema operacional subjacente, realizar comunicações pela rede ou excluir arquivos.
Essa regra localiza valores Newtonsoft.Json.TypeNameHandling diferentes de None
. Se você quiser desserializar somente quando um Newtonsoft.Json.Serialization.ISerializationBinder for especificado para restringir tipos desserializados, desabilite essa regra e, em vez dela, habilite as regras CA2327, CA2328, CA2329 e CA2330.
Como corrigir violações
- Use o valor
None
de TypeNameHandling, se possível. - 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.
- Restrinja tipos desserializados. Implemente um Newtonsoft.Json.Serialization.ISerializationBinder personalizado. Antes de desserializar com Json.NET, verifique se o ISerializationBinder personalizado está especificado na propriedade Newtonsoft.Json.JsonSerializerSettings.SerializationBinder. No método Newtonsoft.Json.Serialization.ISerializationBinder.BindToType substituído, se o tipo for inesperado, retorne
null
ou gere uma exceção para interromper a desserialização.- Se você restringir tipos desserializados, convém desabilitar essa regra e habilitar as regras CA2327, CA2328, CA2329 e CA2330. As regras CA2327, CA2328, CA2329 e CA2330 ajudam a garantir o uso de um ISerializationBinder ao usar valores TypeNameHandling diferentes de
None
.
- Se você restringir tipos desserializados, convém desabilitar essa regra e habilitar as regras CA2327, CA2328, CA2329 e CA2330. As regras CA2327, CA2328, CA2329 e CA2330 ajudam a garantir o uso de um ISerializationBinder ao usar valores TypeNameHandling diferentes de
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 CA2326
// The code that's violating the rule is on this line.
#pragma warning restore CA2326
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.CA2326.severity = none
Para obter mais informações, confira Como suprimir avisos de análise de código.
Exemplos de pseudocódigo
Violação
using Newtonsoft.Json;
public class ExampleClass
{
public JsonSerializerSettings Settings { get; }
public ExampleClass()
{
Settings = new JsonSerializerSettings();
Settings.TypeNameHandling = TypeNameHandling.All; // CA2326 violation.
}
}
Imports Newtonsoft.Json
Public Class ExampleClass
Public ReadOnly Property Settings() As JsonSerializerSettings
Public Sub New()
Settings = New JsonSerializerSettings()
Settings.TypeNameHandling = TypeNameHandling.All ' CA2326 violation.
End Sub
End Class
Solução
using Newtonsoft.Json;
public class ExampleClass
{
public JsonSerializerSettings Settings { get; }
public ExampleClass()
{
Settings = new JsonSerializerSettings();
// The default value of Settings.TypeNameHandling is TypeNameHandling.None.
}
}
Imports Newtonsoft.Json
Public Class ExampleClass
Public ReadOnly Property Settings() As JsonSerializerSettings
Public Sub New()
Settings = New JsonSerializerSettings()
' The default value of Settings.TypeNameHandling is TypeNameHandling.None.
End Sub
End Class
Regras relacionadas
CA2327: Não usar JsonSerializerSettings não seguras
CA2328: Verificar se as JsonSerializerSettings são seguras
CA2329: Não desserializar com JsonSerializer usando uma configuração não segura
CA2330: Verificar se o JsonSerializer tem uma configuração segura durante a desserialização