J'utilise Backbone.js et le serveur Web Tornado. Le comportement standard pour recevoir des données de collection dans Backbone consiste à envoyer en tant que tableau JSON.
D'autre part, le comportement standard de Tornado est de ne pas autoriser JSON Array en raison de la vulnérabilité suivante:
http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx
Un lien connexe est: http://haacked.com/archive/2009/06/25/json-hijacking.aspx
Il me semble plus naturel de ne pas avoir à envelopper mon JSON dans un objet alors qu'il s'agit vraiment d'une liste d'objets.
Je n'ai pas pu reproduire ces attaques dans les navigateurs modernes (c'est-à-dire Chrome, Firefox, Safari et IE9 actuels). Dans le même temps, je n'ai pu confirmer nulle part que les navigateurs modernes avaient résolu ces problèmes.
Pour m'assurer que je ne suis trompé ni par d'éventuelles faibles compétences en programmation ni par de mauvaises compétences en recherche sur Google:
Ces attaques de détournement JSON sont-elles toujours un problème aujourd'hui dans les navigateurs modernes?
(Remarque: Désolé pour le doublon possible à: Est-il possible de faire un `` détournement JSON '' sur un navigateur moderne? Mais comme la réponse acceptée ne semble pas répondre à la question - j'ai pensé qu'il était temps de la poser à nouveau et d'obtenir des explications plus claires .)
Réponses:
Non, il n'est plus possible de capturer les valeurs transmises aux constructeurs
[]
ou{}
dans Firefox 21, Chrome 27 ou IE 10. Voici une petite page de test, basée sur les principales attaques décrites dans http://www.thespanner.co.uk / 2011/05/30 / json-détournement / :( http://jsfiddle.net/ph3Uv/2/ )
Il remplace
window.Array
et ajoute un setter àObject.prototype.foo
et teste l'initialisation des tableaux et des objets via les formes courtes et longues.La spécification ES4 , dans la section 1.5, "exige que les liaisons standard globales d'Objet et Array soient utilisées pour construire de nouveaux objets pour les initialiseurs d'objets et de tableaux" et note dans Précédente d'implémentation que "Internet Explorer 6, Opera 9.20 et Safari 3 font ne respecte pas les reliaisons locales ou globales d'Object et de Array, mais utilise les constructeurs Object et Array d'origine. " Ceci est conservé dans ES5, section 11.1.4 .
Allen Wirfs-Brock a expliqué que ES5 spécifie également que l'initialisation d'objet ne doit pas déclencher les setters, car elle utilise DefineOwnProperty. MDN: Working with Objects note que «À partir de JavaScript 1.8.1, les setters ne sont plus appelés lors de la définition des propriétés dans les initialiseurs d'objets et de tableaux». Ce problème a été abordé dans le numéro 1015 du V8 .
la source