Meu Spider Sense me avisa que usar eval()
para analisar JSON de entrada é uma má ideia. Só estou me perguntando se JSON.parse()
- o que presumo que seja parte do JavaScript e não uma função específica do navegador - é mais seguro.
Meu Spider Sense me avisa que usar eval()
para analisar JSON de entrada é uma má ideia. Só estou me perguntando se JSON.parse()
- o que presumo que seja parte do JavaScript e não uma função específica do navegador - é mais seguro.
Respostas:
Você fica mais vulnerável a ataques se usar eval
: JSON é um subconjunto de Javascript e json.parse apenas analisa JSON, enquanto eval
deixaria a porta aberta para todas as expressões JS.
eval('alert(1)');
.
Todas as JSON.parse
implementações provavelmente usameval()
JSON.parse
é baseado na solução de Douglas Crockford , que usa eval()
ali mesmo na linha 497 .
// 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 + ')');
A vantagem JSON.parse
é que ele verifica se o argumento é a sintaxe JSON correta.
JSON.parse()
no Firefox 28 e no Chromium 33 no meu sistema Linux Mint. Foi 2x mais rápido que eval()
no Firefox e 4x mais rápido no Chromium. Não tenho certeza de qual código-fonte você está postando, mas eles não são a mesma coisa em meus navegadores.
JSON.parse()
implementação nativa que é mais segura e mais rápida do que os eval()
analisadores baseados em.
Nem todos os navegadores têm suporte nativo a JSON, portanto, haverá momentos em que você precisará usar eval()
a string JSON. Use o analisador JSON de http://json.org, pois isso torna tudo muito mais fácil para você.
Eval()
é um mal, mas contra alguns navegadores é um mal necessário, mas onde você pode evitá-lo, faça-o !!!!!
Há uma diferença entre o que JSON.parse () e eval () aceitarão. Experimente a avaliação neste:
var x = "{\" shoppingCartName \ ": \" shopping_cart: 2000 \ "}"
eval(x) //won't work
JSON.parse(x) //does work
Veja este exemplo .
Se você analisar o JSON com eval
, está permitindo que a string que está sendo analisada contenha absolutamente qualquer coisa, então, em vez de ser apenas um conjunto de dados, você pode se ver executando chamadas de função ou qualquer outra coisa.
Além disso, o JSON parse
aceita um parâmetro adicional, reviver, que permite especificar como lidar com certos valores, como datetimes (mais informações e exemplo na documentação inline aqui )
JSON é apenas um subconjunto do JavaScript. Mas eval
avalia a linguagem JavaScript completa e não apenas o subconjunto que é JSON.
JSON.parse
(implementado diretamente no mecanismo JavaScript) analisa apenas JSON. Mas outras implementações não nativas usam para fazer alguma verificação de integridade e depois usam eval
por motivos de desempenho.
JSON.parse
é mais rápido do queeval
, pelo menos no V8 (motor JS do Chromium). Fonte .