Pratiques exemplaires en matière de sécurité JSON?

en faisant des recherches sur la question de JSON vs XML , je suis tombé sur cette question . Maintenant, l'une des raisons de préférer JSON a été répertorié comme la facilité de conversion en Javascript, à savoir avec le eval() . Cela m'a immédiatement paru problématique du point de vue de la sécurité.

donc j'ai commencé à faire des recherches sur les aspects de sécurité de JSON et à travers ce billet de blog sur comment JSON n'est pas aussi sûr que les gens pensent qu'il est .

mise à jour: si vous faites JSON 100% correctement, alors vous aurez seulement les objets au plus haut niveau. Tableau, Les chaînes, les nombres, etc seront tous envelopp. Un objet JSON échouera alors à eval() parce que le JavaScript l'interprète va penser qu'il regarde un bloc plutôt que d'un objet. Ce va un long chemin pour la protection contre les ces attaques, cependant, il est toujours préférable de pour protéger vos données avec onu-prévisible Url.

Ok, donc c'est une bonne règle pour commencer: les objets JSON au niveau supérieur devraient toujours être des objets et jamais des tableaux, des nombres ou des chaînes. Sonne comme une bonne règle pour moi.

y a-t-il autre chose à faire ou à éviter en ce qui concerne la sécurité liée à JSON et AJAX?

la dernière partie de la citation ci-dessus mentionne des URLs imprévisibles. Faire quelqu'un a plus d'informations à ce sujet, en particulier comment vous le faites en PHP? Je suis beaucoup plus expérimenté en Java que PHP et en Java c'est facile (en ce que vous pouvez mapper toute une gamme D'URLs à un seul servlet) alors que tous les PHP que j'ai fait ont mappé une seule URL au script PHP.

en outre, comment exactement utilisez-vous des URLs imprévisibles pour augmenter la sécurité?

72
demandé sur Community 2008-12-28 02:40:07

3 réponses

la faille de sécurité principale du blog (CSRF), n'est pas spécifique à JSON. C'est juste un gros trou en utilisant XML à la place. En effet, c'est tout aussi mauvais sans aucun appel asynchrone; les liens réguliers sont tout aussi vulnérables.

quand les gens parlent D'URL uniques, ils ne veulent généralement pas dire http://yourbank.com/json-api/your-name/big-long-key-unique-to-you/statement . Au lieu de cela, il est plus commun de faire quelque chose d'autre au sujet de la demande unique; à savoir un valeur dans le formulaire post, ou un paramètre URL.

il s'agit généralement d'un token aléatoire inséré dans le formulaire du côté du serveur, puis vérifié lorsqu'une requête est faite.

Le tableau/objet sont des nouvelles de moi:

Script-Tags: l'attaquant peut intégrer un étiquette de script pointant vers un serveur distant et le navigateur sera efficace eval() la réponse pour vous, mais il jette la réponse et depuis JSON est tous la réponse, vous êtes en sécurité.

dans ce cas, votre site n'a pas besoin d'utiliser JSON du tout pour être vulnérable. Mais oui, si un attaquant peut insérer du HTML aléatoire dans votre site, vous êtes grillé.

18
répondu Chase Seibert 2008-12-28 04:54:40

il y a un certain nombre d'attaques de sécurité contre JSON, en particulier XSRF.

la vulnérabilité se produit lorsqu'un service web utilise des témoins pour l'authentification et répond à un tableau JSON contenant des données sensibles en réponse à une demande GET.

si un attaquant peut tromper un utilisateur qui est connecté à un service, naive-webapp.com, à visiter leur site (ou tout autre site qui intègre une IFRAME qu'ils contrôlent, par exemple via des annonces intégrées) alors ils peuvent insérer une étiquette <script> avec un SRC à la naive-webapp.com, et peut-être voler les données de l'utilisateur. Cela dépend d'un quirk javascript avec le constructeur JavaScript Array comme ceci:

 <script>
   // Overload the Array constructor so we can intercept data
   var stolenArrays = [];
   var RealArray = Array;
   Array = function () {
     var arr = RealArray.apply(arguments);
     stolenArrays.push(arr);
     return arr;
   }
 </script>
 <!-- even though the attacker can't access the cookies,
   - he can cause the browser to send them to naive-webapp.com -->
 <script src="//naive-webapp.com/..."></script>
 <script>
   // now stolenArrays contains any data from the parsed JSON
 </script>

EcmaScript 5 a corrigé le comportement confus qui a amené [] à chercher Array sur l'objet global et de nombreux navigateurs modernes ne sont plus sensibles à cette attaque.

soit dit en passant, le pétrole est faux au sujet imprévisible URL. Les identificateurs aléatoires cryptographiques sécurisés dans les URLs sont un excellent moyen de protéger les ressources. La sécurité fondée sur l'identité n'est pas une panacée comme le suggère Oil. Voir http://waterken.sourceforge.net/ pour un exemple d'une application distribuée schéma basé sur cryptographique sécurisé identificateurs dans les Url qui ne nécessite pas un concept de l'identité.

EDIT:

lorsque vous considérez JSON vs XML, vous devriez être conscient de XML spécifiques des vecteurs d'attaque.

XX , attaques D'entités externes XML, utilisez XML conçu pour accéder au système de fichiers et les ressources réseau par le pare-feu.

<!DOCTYPE root 
[
<!ENTITY foo SYSTEM "file:///c:/winnt/win.ini">
]>
...
<in>&foo;</in>

L'Application intègre l'entrée (paramètre "in", qui contient la victoire.ini file) à la réponse du service web.

53
répondu Mike Samuel 2011-09-01 17:17:04

c'est toujours meilleur pour protéger vos données sécurisées avec des URLs imprévisibles.

c'est moi qui souligne. Quel non-sens! C'est best pour protéger vos données sécurisées avec une authentification appropriée et peut-être un cryptage en plus de cela. Les échanges JSON peuvent toujours utiliser les techniques d'authentification existantes (par exemple les sessions via les cookies) et SSL.

Compter sur quelqu'un qui ne devine pas une URL (ce dont il parle effectivement) sera seulement une technique raisonnable (et même alors, seulement juste) quand vous utilisez JSON pour exporter des données à un tiers anonyme (par exemple un service web). Un exemple est L'API de service Web de Google où les utilisateurs anonymes accèdent à Google-données par l'intermédiaire d'autres sites web. Ils utilisent les clés domain-referrer et API pour s'assurer que le site man-in-the-middle est autorisé à fournir des données Gooogle.

si vous êtes il suffit d'utiliser JSON pour envoyer des données privées à et depuis un agent utilisateur direct et connu, utilisez une authentification et un chiffrement réels. Si vous essayez de fournir un service web, alors il dépend vraiment de la façon dont "sécurisé" ces données va être. Si ce ne sont que des données publiques et que vous ne vous souciez pas de savoir qui peut les lire, Je ne vois pas l'intérêt de créer une URL hachée.


Edit: pour démontrer ce qu'ils signifient, considérez ceci. Imaginez que votre banque a fourni un API JSON pour obtenir des déclarations. Si je pouvais taper http://yourbank.com/json-api/your-name/statement , tu ne serais probablement pas content.

ils pouvaient générer une chaîne de caractères unique pour votre compte qui était nécessaire dans n'importe quelle requête JSON, par exemple: http://yourbank.com/json-api/your-name/big-long-key-unique-to-you/statement

j'aurais beaucoup moins de chance de pouvoir deviner cela. Mais voudriez-vous vraiment que ce soit le seul tampon entre vos données vraiment sécurisées et les voleurs d'identité potentiels? Aucun.

3
répondu Oli 2008-12-28 00:05:46