Por que o Google insere while(1); no JSON e como não cair nessa armadilha

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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));


Erro

Blogs

Book Recommendations