Por que o Google insere while(1); no JSON e como não cair nessa armadilha: principais erros de desenvolvedores JavaScript
Se você já olhou no console do desenvolvedor ao trabalhar com a API do Google ou simplesmente pesquisou respostas estranhas do servidor, certamente já notou algo como:
while(1);["some","data"]Parece um loop infinito que travará o navegador, certo? Mas na verdade é um mecanismo de proteção genial. Vamos entender por que o Google adiciona while(1) ao JSON, quais erros os desenvolvedores cometem ao lidar com essas respostas e como evitá-los.
Esta pergunta é uma das mais populares no Stack Overflow (milhares de visualizações), e não é à toa. Ela aborda não apenas detalhes técnicos, mas também princípios fundamentais de segurança web.
O que é while(1); no JSON e de onde veio?
Vamos começar pelo principal. O Google adiciona while(1) ao JSON não para quebrar seu código, mas para proteger contra um ataque chamado JSON Hijacking (sequestro de JSON).
Imagine os bons e velhos tempos em que os sites usavam arrays JSON de nível superior (por exemplo, [{"user":"admin","token":"secret"}]). Um invasor poderia sobrescrever o construtor global Array ou Object e roubar dados através de uma tag <script>. O navegador executava o JSON como JavaScript e os dados vazavam.
A solução do Google foi adicionar o prefixo while(1);. Isso torna o JSON inválido como JavaScript (o loop infinito impede a execução do script malicioso), mas o JSON em si permanece válido — basta analisá-lo corretamente, removendo o prefixo.
Atualmente, essa prática se tornou um padrão de segurança para muitas APIs grandes. Mas se você não souber disso, seu código pode quebrar.
Top 5 erros de desenvolvedores JavaScript ao trabalhar com JSON protegido
Erro nº 1: Tentar analisar a resposta diretamente
O erro mais comum: o desenvolvedor recebe a resposta do servidor e a passa diretamente para JSON.parse(). O resultado é um erro de análise, porque while(1); não é um JSON válido.
fetch('https://api.google.com/some-endpoint') .then(response => response.text()) .then(data => { // Erro! JSON.parse vai falhar const parsed = JSON.parse(data); console.log(parsed); }) .catch(err => console.error('Erro de análise:', err));Como evitar: Sempre remova o prefixo while(1); antes de analisar.
fetch('https://api.google.com/some-endpoint') .then(response => response.text()) .then(data => { // Remove o prefixo de proteção const cleanJson = data.replace(/^\\)?\\s*while\\s*\\(\\s*1\\s*\\)\\s*;\\s*/, ''); const parsed = JSON.parse(cleanJson); console.log(parsed); }) .catch(err => console.error('Erro de análise:', err));Erro nº 2: Usar response.json() sem tratamento
O método response.json() na Fetch API espera JSON puro. Se o servidor retornar while(1);..., o response.json() lançará uma exceção. Desenvolvedores frequentemente pensam que é um bug da API, e não uma característica de segurança.
// Este código falhará com erro "Unexpected token w"fetch('https://api.google.com/endpoint') .then(response => response.json()) // Erro! .then(data => console.log(data));Como evitar: Use response.text() e depois remova o prefixo manualmente.
fetch('https://api.google.com/endpoint') .then(response => response.text()) .then(text => { const jsonText = text.replace(/^\\)?\\s*while\\s*\\(\\s*1\\s*\\)\\s*;\\s*/, ''); return JSON.parse(jsonText); }) .then(data => console.log(data));