102 votes

JSON.analyser vs eval()

Mon Sens d'Araignée me prévient que l'utilisation d' eval() analyser entrant JSON est une mauvaise idée. Je me demandais simplement si JSON.parse() - ce qui je suppose est une partie de JavaScript et pas un navigateur spécifique à la fonction - qui est plus sûr.

118voto

jldupont Points 31331

Vous êtes plus vulnérable à des attaques si vous utilisez eval: JSON est un sous-ensemble de Javascript et json.analyser simplement analyse JSON alors qu' eval laisserait la porte ouverte à tous les JS expressions.

42voto

plodder Points 1307

Tous JSON.parse des implémentations plus probablement, eval()

JSON.parse est basé sur Douglas Crockford de la solution, qui utilise eval() sur la ligne 469.

// In the third stage we use the eval function to compile the text into a
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
// in JavaScript: it can begin a block or an object literal. We wrap the text
// in parens to eliminate the ambiguity.

j = eval('(' + text + ')');

L'avantage de l' JSON.parse , c'est qu'il vérifie l'argument est correct syntaxe JSON.

15voto

AutomatedTester Points 14713

Tous les navigateurs ont native prise en charge de JSON, donc il y aura des moments où vous devez utiliser eval() de la chaîne JSON. L'utilisation de JSON analyseur de http://json.org que qui gère tout ce qui beaucoup plus facile pour vous.

Eval() est un mal, mais contre certains navigateurs ses un mal nécessaire, mais où vous pouvez l'éviter, faire!!!!!!!

11voto

Jeff Lowery Points 125

Il y a une différence entre ce que JSON.parse() et la fonction eval() accepte. Essayez eval sur ceci:

var x = "{\"shoppingCartName\":\"panier_achat:2000\"}"

eval(x)         //won't work
JSON.parse(x)   //does work

Voir cet exemple.

9voto

David Hedlund Points 66192

Si vous parser le JSON avec eval, vous êtes en permettant à la chaîne d'être analysée afin de contenir absolument n'importe quoi, donc au lieu d'être simplement un ensemble de données, vous pourriez vous retrouver à l'exécution des appels de fonction, ou que ce soit.

Aussi, JSON de l' parse accepte un second paramètre, reviver, qui vous permet de spécifier la façon de traiter avec certaines valeurs, telles que datetimes (plus d'info et l'exemple dans la ligne de la documentation ici)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X