CA2326 : N’utilisez pas de valeurs TypeNameHandling autres que None
Propriété | Value |
---|---|
Identificateur de la règle | CA2326 |
Titre | N’utilisez pas de valeurs TypeNameHandling autres que None |
Catégorie | Sécurité |
Le correctif est cassant ou non cassant | Sans rupture |
Activé par défaut dans .NET 8 | Non |
Cause
Cette règle se déclenche lorsque l’une des conditions suivantes est remplie :
- Une valeur d’énumération Newtonsoft.Json.TypeNameHandling, autre que
None
, est référencée. - Une valeur entière représentant une valeur autre que zéro est affectée à une variable TypeNameHandling.
Description de la règle
Les désérialiseurs non sécurisés sont vulnérables lors de la désérialisation de données non approuvées. Un attaquant peut modifier les données sérialisées pour y inclure des types inattendus afin d’injecter des objets avec des effets secondaires malveillants. Une attaque contre un désérialiseur non sécurisé peut, par exemple, exécuter des commandes sur le système d’exploitation sous-jacent, communiquer sur le réseau ou supprimer des fichiers.
Cette règle recherche les valeurs Newtonsoft.Json.TypeNameHandling autres que None
. Si vous souhaitez désérialiser uniquement lorsqu’un Newtonsoft.Json.Serialization.ISerializationBinder est spécifié pour restreindre les types désérialisés, désactivez cette règle et activez plutôt les règles CA2327, CA2328, CA2329 et CA2330 .
Comment corriger les violations
- Utilisez la valeur
None
de TypeNameHandling dans la mesure du possible. - Rendez les données sérialisées inviolables. Après la sérialisation, signez par chiffrement les données sérialisées. Avant la désérialisation, validez la signature de chiffrement. Protégez la clé de chiffrement contre la divulgation, et concevez un mécanisme de renouvellement des clés.
- Restreignez les types désérialisés. Implémentez un Newtonsoft.Json.Serialization.ISerializationBinder personnalisé. Avant de désérialiser avec Json.NET, assurez-vous que votre ISerializationBinder personnalisé est spécifié dans la propriété Newtonsoft.Json.JsonSerializerSettings.SerializationBinder. Dans la méthode Newtonsoft.Json.Serialization.ISerializationBinder.BindToType remplacée, si le type est inattendu, retournez
null
ou levez une exception pour arrêter la désérialisation.- Si vous limitez les types désérialisés, vous pouvez désactiver cette règle et activer les règles CA2327, CA2328, CA2329 et CA2330. Les règles CA2327, CA2328, CA2329 et CA2330 permettent de garantir que vous utilisez un ISerializationBinder lors de l’utilisation de valeurs TypeNameHandling autres que
None
.
- Si vous limitez les types désérialisés, vous pouvez désactiver cette règle et activer les règles CA2327, CA2328, CA2329 et CA2330. Les règles CA2327, CA2328, CA2329 et CA2330 permettent de garantir que vous utilisez un ISerializationBinder lors de l’utilisation de valeurs TypeNameHandling autres que
Quand supprimer les avertissements
Vous pouvez supprimer sans risque un avertissement de cette règle si :
- Vous savez que l’entrée est approuvée. Considérez que la limite d’approbation et les flux de données de votre application peuvent changer au fil du temps.
- Vous avez pris l’une des précautions décrites dans Comment corriger les violations.
Supprimer un avertissement
Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.
#pragma warning disable CA2326
// The code that's violating the rule is on this line.
#pragma warning restore CA2326
Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none
dans le fichier de configuration.
[*.{cs,vb}]
dotnet_diagnostic.CA2326.severity = none
Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.
Exemples de pseudo-code
Violation
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
Solution
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
Règles associées
CA2327 : N’utilisez pas de JsonSerializerSettings non sécurisés
CA2328 : Vérifiez que les JsonSerializerSettings sont sécurisés
CA2329 : Ne désérialisez pas avec JsonSerializer à l’aide d’une configuration non sécurisée
CA2330 : Vérifiez que JsonSerializer a une configuration sécurisée lors de la désérialisation.