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.
javascript
json
Kevin Major
fonte
fonte
JSON.parse
é mais rápido do queeval
, pelo menos no V8 (motor JS do Chromium). Fonte .Respostas:
Você fica mais vulnerável a ataques se usar
eval
: JSON é um subconjunto de Javascript e json.parse apenas analisa JSON, enquantoeval
deixaria a porta aberta para todas as expressões JS.fonte
eval('alert(1)');
.Todas as
JSON.parse
implementações provavelmente usameval()
JSON.parse
é baseado na solução de Douglas Crockford , que usaeval()
ali mesmo na linha 497 .A vantagem
JSON.parse
é que ele verifica se o argumento é a sintaxe JSON correta.fonte
JSON.parse()
no Firefox 28 e no Chromium 33 no meu sistema Linux Mint. Foi 2x mais rápido queeval()
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 oseval()
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 !!!!!fonte
Há uma diferença entre o que JSON.parse () e eval () aceitarão. Experimente a avaliação neste:
var x = "{\" shoppingCartName \ ": \" shopping_cart: 2000 \ "}"
Veja este exemplo .
fonte
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 )fonte
JSON é apenas um subconjunto do JavaScript. Mas
eval
avalia a linguagem JavaScript completa e não apenas o subconjunto que é JSON.fonte
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 usameval
por motivos de desempenho.