Por qué Google inserta while(1); en JSON y cómo no caer en la trampa: principales errores de desarrolladores JavaScript
Si alguna vez has mirado en la consola del desarrollador al trabajar con la API de Google o simplemente has buscado respuestas extrañas del servidor, seguramente habrás notado algo como:
while(1);["some","data"]Parece un bucle infinito que colgaría el navegador, ¿verdad? Pero en realidad es un ingenioso mecanismo de protección. Analicemos por qué Google antepone while(1) al JSON, qué errores cometen los desarrolladores al trabajar con estas respuestas y cómo evitarlos.
Esta pregunta es una de las más populares en Stack Overflow (miles de visitas), y no es para menos. Aborda no solo detalles técnicos, sino también principios fundamentales de seguridad web.
¿Qué es while(1); en JSON y de dónde viene?
Empecemos por lo principal. Google antepone while(1) al JSON no para romper tu código, sino para protegerlo de un ataque llamado JSON Hijacking (secuestro de JSON).
Imagina los viejos tiempos, cuando los sitios usaban arreglos JSON de nivel superior (por ejemplo, [{"user":"admin","token":"secret"}]). Un atacante podía sobrescribir el constructor global Array u Object y robar datos a través de la etiqueta <script>. El navegador ejecutaba el JSON como JavaScript y los datos se filtraban.
La solución de Google fue agregar el prefijo while(1);. Esto hace que el JSON sea JavaScript no válido (el bucle infinito impide que se ejecute un script malicioso), pero el JSON en sí sigue siendo correcto; solo hay que analizarlo correctamente eliminando el prefijo.
Hoy en día, esta práctica se ha convertido en un estándar de seguridad para muchas API importantes. Pero si no la conoces, tu código podría fallar.
Principales 5 errores de desarrolladores JavaScript al trabajar con JSON protegido
Error n.º 1: Intentar analizar la respuesta tal cual
El error más común: el desarrollador recibe la respuesta del servidor y la pasa directamente a JSON.parse(). El resultado es un error de análisis porque while(1); no es JSON válido.
fetch('https://api.google.com/some-endpoint') .then(response => response.text()) .then(data => { // ¡Error! JSON.parse fallará const parsed = JSON.parse(data); console.log(parsed); }) .catch(err => console.error('Error de análisis:', err));Cómo evitarlo: Siempre elimina el prefijo while(1); antes de analizar.
fetch('https://api.google.com/some-endpoint') .then(response => response.text()) .then(data => { // Eliminamos el prefijo de protección const cleanJson = data.replace(/^\\)?\\s*while\\s*\\(\\s*1\\s*\\)\\s*;\\s*/, ''); const parsed = JSON.parse(cleanJson); console.log(parsed); }) .catch(err => console.error('Error de análisis:', err));Error n.º 2: Usar response.json() sin procesamiento
El método response.json() en Fetch API espera JSON puro. Si el servidor devuelve while(1);..., entonces response.json() lanzará una excepción. Los desarrolladores suelen pensar que es un error de la API, no una característica de seguridad.
// Este código fallará con el error "Unexpected token w"fetch('https://api.google.com/endpoint') .then(response => response.json()) // ¡Error! .then(data => console.log(data));Cómo evitarlo: Usa response.text() y luego elimina manualmente el prefijo.
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));