Supposons que votre site Web dispose d'une GetUser
méthode Web:
http://www.example.com/User/GetUser/32
qui renvoie une réponse JSON:
{ "Name": "John Doe" }
Si cette méthode n'accepte que les requêtes POST, le contenu ne sera renvoyé au navigateur que si une requête AJAX est effectuée à l' http://www.example.com/User/GetUser/32
aide de la méthode POST. Notez qu'à moins que vous n'ayez implémenté CORS , le navigateur protégera les données des autres domaines faisant cette demande au vôtre.
Cependant, si vous avez autorisé les requêtes GET à ce moment-là et que vous faites 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 script
balise dans le HTML. par exemple sur www.evil.com
:
<script src="http://www.example.com/User/GetUser/32"></script>
Ce JavaScript devrait être inutile www.evil.com
car il ne devrait y avoir aucun moyen de lire l'objet retourné par votre méthode web. Cependant, en raison de bugs dans les anciennes versions de navigateurs (ex: Firefox 3), il est possible que des objets prototypes JavaScript soient redéfinis et permettent www.evil.com
de lire vos données renvoyées par votre méthode. C'est ce qu'on appelle le détournement JSON.
Voir cet article pour quelques méthodes pour éviter cela. Cependant, ce n'est pas un problème connu avec les dernières versions des navigateurs modernes (Firefox, Chrome, IE).
www.example.com/User/DeleteUser/32
) car la demande inclura les cookies nécessaires à l'authentification car ils proviennent de la machine de la victime.[Authorize]
ne sauvera pas vous de l'attaque détaillée ici dans le cas d'un navigateur très ancien , soit - il est l'utilisateur se rendantwww.evil.com
si la demandewww.evil.com
fait dewww.example.com
contiendra le cookie d'autorisation.dans votre retour, utilisez les éléments suivants:
la source
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 y a une chance qu'un utilisateur malveillant puisse accéder à la charge utile via un processus connu sous le nom de piratage JSON. Vous ne souhaitez pas renvoyer d'informations sensibles à l'aide de JSON dans une requête GET.
Si vous avez besoin d'envoyer JSON en réponse à un GET et que vous n'exposez pas de données sensibles, vous pouvez explicitement autoriser le comportement en le passant
JsonRequestBehavior.AllowGet
comme deuxième paramètre à laJson
méthode.Tel que
Voici un article intéressant de Phil Haack
JSON Hijacking
sur pourquoi ne pas utiliser Json avec la méthode GETla source
Lorsque nous voulons renvoyer un objet json au client à partir de l'application MVC, nous devons spécifier explicitement JsonRequestBehavior.AllowGet lors du retour d'un objet. En conséquence, je renvoie les données json comme ci-dessous pour résoudre le problème:
la source
Vous devez utiliser JsonRequestBehavior.AllowGet pour Json Response comme ceci:
la source
return Json ("Success", JsonRequestBehavior.AllowGet)
la source