Quelles informations sensibles pourraient être divulguées lors de la définition de JsonRequestBehavior sur AllowGet

J’ai reçu la même erreur chaque fois que je teste une nouvelle URL partir de la barre d’adresse de mon navigateur lorsque je returning Json (à l’aide de l’ MVC JsonResult helper ):

Cette demande a été bloquée car des informations sensibles peuvent être divulguées à des sites Web tiers lorsque ceux-ci sont utilisés dans une GET request . Pour autoriser GET requests , définissez JsonRequestBehavior sur AllowGet .

Plutôt que de grogner en remerciement et de lancer Fiddler pour faire une demande de post, cette fois, je me demande exactement ce que représente une requête GET qu’une requête POST ne fait pas?

Supposons que votre site Web ait une méthode Web GetUser :

http://www.example.com/User/GetUser/32

qui renvoie une réponse JSON:

 { "Name": "John Doe" } 

Si cette méthode accepte uniquement les requêtes POST, le contenu ne sera renvoyé au navigateur que si une requête AJAX est envoyée à http://www.example.com/User/GetUser/32 à l’aide de la méthode POST. Notez que, sauf si vous avez implémenté CORS , le navigateur protégera les données des autres domaines soumettant cette requête à la vôtre.

Cependant, si vous autorisiez les requêtes GET et en effectuant une requête AJAX similaire à celle ci-dessus avec GET au lieu de POST, un utilisateur malveillant pourrait inclure votre JSON dans le contexte de son propre site en utilisant une balise script dans le code HTML. par exemple sur www.evil.com :

  

Ce JavaScript devrait être inutile sur www.evil.com car il ne devrait y avoir aucun moyen de lire l’object renvoyé par votre méthode Web. Cependant, en raison de bogues dans les anciennes versions des navigateurs (par exemple Firefox 3), il est possible de redéfinir les objects prototypes JavaScript et de permettre à www.evil.com de lire vos données renvoyées par votre méthode. Ceci est connu sous le nom de piratage JSON.

Voir ce post pour quelques méthodes de prévention. Cependant, ce n’est pas un problème connu avec les versions ultérieures des navigateurs modernes (Firefox, Chrome, IE).

dans votre déclaration, utilisez ce qui suit:

 return this.Json("you result", JsonRequestBehavior.AllowGet); 

Par défaut, le framework ASP.NET MVC ne vous permet pas de répondre à une requête GET avec une charge utile JSON car il existe un risque qu’un utilisateur malveillant accède à la charge via un processus appelé JSON Hijacking. Vous ne souhaitez pas renvoyer d’informations sensibles à l’aide de JSON dans une requête GET.

Si vous devez envoyer JSON en réponse à un GET et ne pas exposer de données sensibles, vous pouvez autoriser explicitement ce comportement en transmettant JsonRequestBehavior.AllowGet comme second paramètre à la méthode Json .

Lire JSON Hijacking de Phil Haack

Lorsque nous voulons renvoyer un object json au client à partir de l’application MVC, nous devons explicitement spécifier JsonRequestBehavior.AllowGet lors du renvoi d’un object. En conséquence, je renvoie les données json ci-dessous pour résoudre le problème:

  return Json(yourObjectData, JsonRequestBehavior.AllowGet);