Les meilleures pratiques de sécurité JSON?

En recherchant la question de JSON vs XML , j'ai rencontré cette question . Maintenant, l'une des raisons de préférer JSON a été répertoriée comme la facilité de conversion en Javascript, à savoir avec l' eval() . Maintenant, cela m'a immédiatement surpris comme potentiellement problématique du point de vue de la sécurité.

J'ai donc commencé à faire des recherches sur les aspects de sécurité de JSON et à travers cette publication de blog sur la façon dont JSON n'est pas aussi sûr que les gens pensent . Cette partie a retenu:

Mise à jour: si vous effectuez JSON 100% correctement, vous n'aurez que des objets au niveau supérieur. Les tableaux, les chaînes, les numéros, etc. seront tous enveloppés. Un objet JSON échouera alors à eval () car l'interprète JavaScript pensera qu'il regarde un bloc plutôt qu'un objet. Cela permet de protéger contre ces attaques, mais il est toujours préférable de protéger vos données sécurisées avec des URL non prévisibles.

D'accord, c'est une bonne règle pour commencer: les objets JSON au niveau supérieur doivent toujours être des objets et ne jamais des tableaux, des nombres ou des chaînes. Cela me paraît une bonne règle.

Y a-t-il autre chose à faire ou à éviter quand il s'agit de la sécurité JSON et AJAX?

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

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

Le principal trou de sécurité du blog (CSRF) n'est pas spécifique à JSON. C'est plutôt un grand trou à l'aide de XML. En effet, c'est tout aussi mauvais avec aucun appel asynchrone; Les liens réguliers sont tout aussi vulnérables.

Lorsque les gens parlent d'URL unique, ils ne signifient généralement pas http://yourbank.com/json-api/ votre nom / big -long-key-unique-to- you/statement . Au lieu de cela, il est plus commun de faire autre chose sur la demande unique; À savoir une valeur dans la publication FORM ou un paramètre URL.

Habituellement, cela implique un jeton aléatoire inséré dans le formulaire du côté du serveur, puis vérifié lors de la demande.

La chose array / object est une nouvelle pour moi:

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

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

Il existe un certain nombre d'attaques de sécurité contre JSON, en particulier XSRF.

La vulnérabilité se produit lorsqu'un service Web utilise des cookies pour l'authentification et répond avec un réseau JSON contenant des données sensibles en réponse à une requête GET.

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

  <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 déroutant qui a permis à [] de rechercher Array sur l'objet global et de nombreux navigateurs modernes ne sont plus susceptibles de cette attaque.

Par ailleurs, Oil ne porte pas sur les URL imprévisibles. Les identificateurs aléatoires cryptographiquement sécurisés dans les URL sont une bonne façon de protéger les ressources. La sécurité basée sur l'identité n'est pas une panacée telle que suggère l'huile. Voir http://waterken.sourceforge.net/ pour un exemple d'un schéma d'application distribué sécurisé basé sur des identifiants cryptographiquement sécurisés dans des URL qui ne nécessitent pas de concept d'identité.

MODIFIER:

Lorsque vous considérez JSON vs XML, vous devez également prendre en compte les vecteurs d'attaque spécifiques à XML.

XXE , XML Attaques d'entités externes, utilisation de XML conçu pour accéder au système de fichiers et aux ressources réseau via 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 le fichier win.ini) à la réponse du service Web.

Il est toujours préférable de protéger vos données sécurisées avec des URL non prévisibles.

L'accent est mis. Quelle absurdité! Il est préférable de protéger vos données sécurisées avec une authentification correcte et éventuellement un certain chiffrement. Les échanges JSON peuvent encore utiliser les techniques d'authentification existantes (p. Ex. Sessions via des cookies) et SSL.

S'appuyant sur quelqu'un qui ne devine pas une URL (ce dont ils parlent effectivement) ne sera qu'une technique raisonnable (et même alors, juste juste) lorsque vous utilisez JSON pour exporter des données vers un tiers anonyme (par exemple, un service Web) . Un exemple est l'API de service Web de Google, où les utilisateurs anonymes accèdent aux données Google via d'autres sites Web. Ils utilisent les clés de référence de domaine et d'API pour s'assurer que le site Web de man-in-the-middle est autorisé à fournir les données de Gooogle.

Si vous utilisez simplement JSON pour envoyer des données privées à partir d'un agent utilisateur direct et connu, utilisez une authentification et un cryptage authentiques. Si vous essayez de fournir un service Web, cela dépend vraiment de la "sécurité" de ces données. Si ce sont simplement des données publiques et que vous ne lisez pas qui peut le lire, je ne vois pas comment faire une URL hachurée.


Modifier: pour démontrer ce qu'ils veulent dire, considérez ceci. Imaginez que votre banque a fourni une API JSON pour obtenir des déclarations. Si je pouvais simplement taper http://yourbank.com/json-api/your-name/statement votre nom / état, vous ne seriez probablement pas le meilleur.

Ils pourraient générer une chaîne 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 / http://yourbank.com/json-api/your-name/big-long-key-unique-to-you/statementhttp://yourbank.com/json-api/your-name/big-long-key-unique-to-you/statementhttp://yourbank.com/json-api/your-name/big-long-key-unique-to-you/statement unique-to- http://yourbank.com/json-api/your-name/big-long-key-unique-to-you/statement / http://yourbank.com/json-api/your-name/big-long-key-unique-to-you/statement

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