flawopen.com/Análise JSON/JSON.parse() vs eval()
JSON.parse() é mais seguro que eval()?
Pense na entrada como um bilhete: JSON.parse() lê os campos de um formulário estruturado, enquanto eval() entrega o bilhete a um interpretador como instruções a executar. JSON.parse() segue a gramática JSON e não executa JavaScript do texto; os valores resultantes ainda precisam ser validados antes do uso.
// Não interprete dados não confiáveis como código-fonte.
const data = eval("(" + untrustedJson + ")");
const data = JSON.parse(untrustedJson);
// Analise JSON como dados; JSON inválido lança SyntaxError.
Por que essa dúvida surge
Antes de JSON.parse() estar amplamente disponível, algum código JavaScript usava eval() para ler JSON, pois o texto JSON se sobrepõe à sintaxe de expressões JavaScript. Essa abordagem avalia um programa JavaScript; portanto, uma entrada controlada por um atacante pode ser tratada como código, em vez de ficar limitada a valores JSON. Use o analisador JSON para JSON.
O que JSON.parse() ainda não protege
JSON.parse() não valida regras de negócio, não autoriza ações nem torna strings analisadas seguras para HTML, SQL, comandos de shell ou URLs. Valide o formato esperado e use codificação de saída adequada ao contexto ou APIs parametrizadas. Se você passar um reviver, esse callback fornecido pela aplicação é executado durante a análise; mantenha-o confiável, simples e sem efeitos colaterais baseados em valores controlados pelo atacante.
Perguntas frequentes
O próprio texto JSON é analisado como dados, não executado como JavaScript. Porém, se a aplicação fornecer um reviver, esse callback confiável é chamado para os valores analisados e pode executar código. Não permita que dados controlados por atacantes escolham ou construam lógica executável para o callback.
Não. Confira o valor analisado em relação ao esquema esperado pela aplicação e às regras de autorização. Use codificação de saída para HTML e consultas parametrizadas para SQL; a análise não higieniza os dados para esses contextos.