web-dev-qa-db-fra.com

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

Je reçois le même ancien problème chaque fois que je teste un nouveau URL à partir de la barre d'adresse de mon navigateur lorsque je suis returning Json (en utilisant le MVC JsonResult helper intégré):

Cette demande a été bloquée car des informations sensibles pourraient être divulguées à des sites Web tiers lorsque cela est utilisé dans un 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 publication, cette fois-ci, je me demande exactement ce qu’est une demande GET qui expose qu’une demande POST ne le fait pas?

105
A. Murray

Supposons que votre site Web utilise 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 demandes POST, le contenu ne sera renvoyé au navigateur que si une demande AJAX est adressée à http://www.example.com/User/GetUser/32 à l'aide de POST. _ méthode. Notez que, sauf si vous avez implémenté CORS , le navigateur protégera les données des autres domaines faisant cette demande à la vôtre.

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

<script src="http://www.example.com/User/GetUser/32"></script>

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

Voir this post pour quelques méthodes permettant d'éviter cela. Cependant, ce n'est pas un problème connu avec les dernières versions des navigateurs modernes (Firefox, Chrome, IE).

74
SilverlightFox

à votre retour, utilisez ce qui suit:

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

Par défaut, l'infrastructure ASP.NET MVC ne vous permet pas de répondre à une demande GET avec une charge JSON, car il est possible qu'un utilisateur malveillant puisse accéder à la charge via un processus appelé détournement JSON. Vous ne souhaitez pas renvoyer d'informations sensibles à l'aide de JSON dans une requête GET.

Si vous devez envoyer du JSON en réponse à un GET et que vous n'exposez pas de données sensibles, vous pouvez explicitement autoriser ce comportement en transmettant _JsonRequestBehavior.AllowGet_ en tant que deuxième paramètre à la méthode Json.

Tel que

_  [HttpGet] //No need to decorate, as by default it will be GET
  public JsonResult GetMyData(){  
    var myResultDataObject = buildMyData(); // build, but keep controller thin
    // delegating buildMyData to builder/Query Builder using CQRS makes easy :)
    return Json(myResultDataObject, JsonRequestBehavior.AllowGet);
  }
_

Voici un article intéressant de Phil Haack JSON Hijacking à propos de pourquoi ne pas utiliser Json avec la méthode GET

53
Murali Murugesan

Lorsque nous voulons renvoyer un objet JSON au client à partir d'une application MVC, nous devons spécifier explicitement JsonRequestBehavior.AllowGet lors du renvoi d'un objet. En conséquence, je retourne les données JSON comme ci-dessous pour résoudre le problème:

    return Json(yourObjectData, JsonRequestBehavior.AllowGet);
7
Loc Huynh

Vous devez utiliser JsonRequestBehavior.AllowGet pour la réponse Json comme suit:

return Json(YourObject, JsonRequestBehavior.AllowGet);
6
keivan kashani