Question

Une requête ajax me renvoie un tableau JSON standard contenant les entrées de mon utilisateur. L'entrée a été filtrée et, à l'aide de la fonction eval (), je peux facilement créer mon objet javascript et mettre à jour ma page ...

Alors voici le problème. Malgré tous les efforts que je déploie pour assainir les entrées, je préférerais ne pas utiliser la fonction eval (). Nous avons vérifié sur Google comment utiliser "JSON dans AJAX sans eval". et ont couru à travers un tas de méthodes différentes ...

Lequel devrais-je utiliser? Existe-t-il un moyen standard et éprouvé de le faire?

Était-ce utile?

La solution

json.org a une belle bibliothèque javascript

utilisation simple:

JSON.parse('[{"some":"json"}]');
JSON.stringify([{some:'json'}]);

Modifier : comme indiqué dans les commentaires, eval est utilisé si vous examinez son source (bien qu'il semble d'abord avoir été nettoyé)

Pour l'éviter complètement, consultez json_parse ou json-sans-eval

json2.js n'est pas sécurisé, json_parse.js est lent, json-sans-eval.js est non-validant

Autres conseils

  

Existe-t-il un moyen standard et éprouvé de le faire?

Il existe un moyen standard de le faire dans la prochaine version JavaScript de ECMAScript 3.1: JSON.parse .

Il sera pris en charge par IE8, Firefox 3.1 / 3.5 et probablement par les autres navigateurs populaires à l’avenir. En attendant, vous pouvez utiliser ou utiliser exclusivement eval (). Le mal peut ou peut ne pas être; ce sera certainement plus lent que JSON.parse. Mais c’est le moyen habituel d’analyser JSON aujourd’hui.

Si un attaquant parvient à injecter du code JavaScript malveillant dans du contenu que vous crachez via JSON, vous avez plus de problèmes à vous soucier que eval-is-evil.

Je dirais qu’une fois que l’entrée a été nettoyée, eval est la meilleure solution. Si votre serveur est compromis, les utilisateurs pourront quand même envoyer les scripts qu'ils souhaitent au client. Donc, mettre un eval n'est pas un gros risque pour la sécurité. Si vous craignez que des personnes manipulent les paquets avant d’atteindre le client, les scripts eux-mêmes peuvent être modifiés.

Ne vous inquiétez pas pour eval. Mais assurez-vous de l'envelopper dans un bloc catch ... afin que vos utilisateurs ne reçoivent pas d'erreur JS si votre JSON est mutilé.

:

Pour convertir en toute sécurité JSON en objet JS, vous devez utiliser un analyseur JSON, tel que la fonction JSON.parse () fournie par cette bibliothèque .

Comparez le modèle de conception de commande suivant: http://en.wikipedia.org/wiki/Command_pattern . Cela étant dit, vous pouvez définir avec précision les opérations qu'un client peut exécuter et votre application sera aussi sûre que l'interprétation sous-jacente.

Cela dépend de ce que vous essayez d'accomplir avec l'assainissement. Le succès du framework du prototype dans le cadre de JSON et de l'évaluation en toute sécurité a été très bien réussi.

Si vous êtes certain qu'il n'y a pas de risque d'injection et que vous n'êtes pas eval () ing dans une boucle, utilisez eval () . Il se comparera favorablement à d’autres options qui seront certainement plus lentes, risqueraient de casser et obliger le client à télécharger du code supplémentaire.

" volé " de jQuery

// Try to use the native JSON parser first
return window.JSON && window.JSON.parse ?
    window.JSON.parse( data ) :
    (new Function("return " + data))();

Problème: Le problème que pose eval est qu’il s’exécute dans la portée globale

eval.call(document, "console.log(this)")
eval.call(navigator, "console.log(this)")
eval.call(window, "console.log(this)")
(function(){eval.call(document, "console.log(this)")})()
>Window

Scénario:

Supposons que vous utilisez des attributs individuels dans le code de marquage de divers éléments de document, tels qu'un attribut onvisible

.
<img src="" onvisible="src='http://www.example.com/myimg.png';">

Vous souhaitez obtenir tous les éléments avec cet attribut, transformer la chaîne onvisible-content-content en une clôture et la placer dans une file d'attente EventHandler. C’est là que le constructeur de la fonction JS entre en jeu.

Function === 0..constructor.constructor
>true

Function('return [this, arguments]').call(window, 1,2,3)
>Window, Arguments[3]]
Function('return [this, arguments]').call(document, 1,2,3)
>Document, Arguments[3]]
Function('return [this, arguments]').call(navigator, 1,2,3)
>Navigator, Arguments[3]]    

Rassembler tout cela:

var eventQueue = [];
var els = document.querySelectorAll('[onvisible]');

for (var el in els) {
    var jscode = els[el].getAttribute('onvisible');
    eventQueue.push( {el:els[el], cb:Function(jscode)} )
}

//eventQueue[0].cb.call(scope, args);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top