web-dev-qa-db-fra.com

Comment les développeurs d'applications Web devraient-ils se défendre contre le piratage JSON?

Quelle est la meilleure défense contre détournement JSON ?

Quelqu'un peut-il énumérer les défenses standard et expliquer leurs forces et leurs faiblesses? Voici quelques défenses que j'ai vues suggérées:

  1. Si la réponse JSON contient des données confidentielles/non publiques, ne diffusez la réponse que si la demande est authentifiée (par exemple, est fournie avec des cookies qui indiquent une session authentifiée).
  2. Si les données JSON contiennent quelque chose de confidentiel ou non public, hébergez-le sur une URL secrète impossible à deviner (par exemple, une URL contenant un nombre aléatoire de 128 bits de qualité cryptographique), et ne partagez cette URL secrète qu'avec les utilisateurs/clients autorisés à voir le Les données.
  3. Mettez while(1); au début de la réponse JSON et demandez au client de le supprimer avant d'analyser le JSON.
  4. Demandez au client d'envoyer des demandes de données JSON en tant que POST (pas un GET), et demandez au serveur d'ignorer les demandes GET pour les données JSON.

Sont-ils tous sécurisés? Y a-t-il des raisons de choisir l'un d'entre eux plutôt que les autres? Y a-t-il d'autres défenses qui me manquent?

42
D.W.

La première défense consiste à s'en tenir à la spécification en utilisant un JSON valide qui nécessite un objet comme entité de niveau supérieur . Toutes les attaques connues sont basées sur le fait que si l'objet de niveau supérieur est un tableau, la réponse est valide Java Code de script qui peut être analysé à l'aide d'une balise <script>.

Si la réponse JSON contient des données confidentielles/non publiques, ne diffusez la réponse que si la demande est authentifiée (par exemple, est fournie avec des cookies qui indiquent une session authentifiée).

C'est le pré-requis pour l'attaque , pas une atténuation. Si le navigateur possède un cookie pour le site A, il l'inclura dans toutes les demandes adressées au site A. Cela est vrai même si la demande a été déclenchée par une balise <script> sur le site B.

Si les données JSON contiennent quelque chose de confidentiel ou non public, hébergez-le sur une URL secrète impossible à deviner (par exemple, une URL contenant un nombre aléatoire de 128 bits de qualité cryptographique), et ne partagez cette URL secrète qu'avec les utilisateurs/clients autorisés à voir le Les données.

Les URL ne sont pas considérées comme une fonction de sécurité . Tous les moteurs de recherche courants ont des extensions/barres d'outils de navigateur qui signalent toute URL visitée au fournisseur du moteur de recherche. Bien qu'ils ne signalent que les URL qui sont explicitement visitées, je ne risquerais pas cela pour les URL JSON non plus.

Demandez au client d'envoyer des demandes de données JSON en tant que POST (pas un GET), et demandez au serveur d'ignorer les demandes GET pour les données JSON.

Cela empêchera l'inclusion de <script>.

Mettez tandis que (1); au début de la réponse JSON et demandez au client de le supprimer avant d'analyser le JSON.

Je suggère une version modifiée de cette approche: Ajoutez </* Au début . while(1) est problématique pour deux raisons: tout d'abord, il est susceptible de déclencher un scanner de programmes malveillants (sur les clients, les proxys et le moteur de recherche). Deuxièmement, il peut être utilisé pour les attaques DoS contre le CPU des internautes. Ces attaques proviennent évidemment de votre serveur.

28

Google utilise " cruauté insaisissable " pour se défendre contre ce type d'attaque. Cette vulnérabilité était corrigée dans Firefox . La vulnérabilité provient de la façon dont les navigateurs implémentent la spécification JSON.

3
rook

1) Si la réponse JSON contient des données confidentielles/non publiques, ne servez la réponse que si la demande est authentifiée (par exemple, est fournie avec des cookies qui indiquent une session authentifiée). 2) Si les données JSON contiennent quelque chose de confidentiel ou non public, hébergez-le sur une URL secrète non devinable (par exemple, une URL contenant un nombre aléatoire de 128 bits de qualité cryptographique), et ne partagez cette URL secrète qu'avec des utilisateurs/clients autorisés à voir les données.

Il n'y a aucune bonne raison de faire les deux (1) et (2).

Le premier est ABAC et le second est ZBAC. Essayer d'obtenir une défense en profondeur en utilisant plusieurs schémas de contrôle d'accès ne fait que compliquer les choses.

3) Mettez while(1); au début de la réponse JSON et demandez au client de le supprimer avant d'analyser le JSON.

4) Demandez au client d'envoyer des demandes de données JSON en tant que POST (pas un GET), et demandez au serveur d'ignorer les demandes GET de données JSON.

Cela ressemble à de bonnes idées et ajoute une défense en profondeur car elle permet de garantir que les informations d'identification ne peuvent pas être détournées.

Aditionellement,

5) Servir uniquement JSON avec des données sensibles via SSL ou un autre canal sécurisé.

pour éviter les fuites de données via MITM.

2
Mike Samuel