TypeNameHandling.All
: risques de sécurité lors de la désérialisation des données non fiables La propriété TypeNameHandling
dans newtonsoft.json dicte comment les objets polymorphes sont désérialisés. Le définir sur TypeNameHandling.All
permet à newtonsoft.json d'instancier des types en fonction de la propriété $type
dans le nouveau JSON. Cependant, cela présente des vulnérabilités de sécurité importantes lors de la gestion des données non fiables.
Implications de sécurité
Les acteurs malveillants peuvent exploiter TypeNameHandling.All
en injectant une propriété $type
spécifiant un type nocif dans le JSON. Cela leur permet d'exécuter du code arbitraire ou d'effectuer des actions indésirables sur le système cible.
Considérons une classe apparemment inoffensive:
<code class="language-csharp">public class Vehicle { public string Make { get; set; } public string Model { get; set; } }</code>
Une charge utile JSON malveillante pourrait ressembler à ceci:
<code class="language-json">{ "$type": "System.Diagnostics.Process", "Make": "Attack", "Model": "DeleteC:\ImportantFiles" }</code>
Bien que les propriétés Make
et Model
soient bénignes, la propriété $type
force la création d'un objet System.Diagnostics.Process
, initiant potentiellement des processus nocifs sur le système. Cela contourne la vérification normale de type et ouvre la porte à diverses attaques.
atténuer le risque
pour empêcher de telles attaques, évitez d'utiliser TypeNameHandling.All
lorsque la désérialisation de JSON à des sources externes et non fiables. Au lieu de cela, utilisez TypeNameHandling.None
pour désactiver la manipulation du nom de type. Alternativement, implémentez une coutume SerializationBinder
pour contrôler méticuleusement quels types sont autorisés pendant la désérialisation, des types de sécurité en plaques blanches. Cela fournit une approche plus granulaire et sécurisée pour manipuler la désérialisation polymorphe.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!