Pourquoi Google insère while(1); dans le JSON et comment ne pas tomber dans le piège

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Pourquoi Google insère while(1); dans le JSON et comment ne pas tomber dans le piège : les meilleures erreurs des développeurs JavaScript



Si vous avez déjà jeté un œil dans la console développeur en travaillant avec l'API Google ou simplement cherché d'étranges réponses du serveur, vous avez sûrement remarqué quelque chose comme :



while(1);["some","data"]


Cela ressemble à une boucle infinie qui ferait planter le navigateur, n'est-ce pas ? Mais en réalité, c'est un mécanisme de protection génial. Comprenons pourquoi Google ajoute while(1) au JSON, quelles erreurs commettent les développeurs avec ces réponses et comment les éviter.



Cette question est l'une des plus populaires sur Stack Overflow (des milliers de vues), et ce n'est pas pour rien. Elle aborde non seulement des subtilités techniques, mais aussi des principes fondamentaux de la sécurité web.



Qu'est-ce que while(1); dans le JSON et d'où vient-il ?



Commençons par l'essentiel. Google ajoute while(1) au JSON non pas pour casser votre code, mais pour se protéger contre une attaque appelée détournement JSON (JSON Hijacking).



Imaginez le bon vieux temps où les sites utilisaient des tableaux JSON de premier niveau (par exemple, [{"user":"admin","token":"secret"}]). Un attaquant pouvait redéfinir le constructeur global Array ou Object et voler des données via une balise <script>. Le navigateur exécutait le JSON comme du JavaScript, et les données fuyaient.



La solution de Google : ajouter le préfixe while(1);. Cela rend le JSON invalide en tant que JavaScript (la boucle infinie empêche l'exécution du script malveillant), mais le JSON lui-même reste correct — il suffit de l'analyser correctement en supprimant le préfixe.



Aujourd'hui, cette pratique est devenue une norme de sécurité pour de nombreuses grandes API. Mais si vous ne la connaissez pas, votre code peut se casser.



Top 5 des erreurs des développeurs JavaScript avec le JSON protégé



Erreur n°1 : Tenter d'analyser la réponse telle quelle



L'erreur la plus fréquente : le développeur reçoit la réponse du serveur et la passe directement à JSON.parse(). Résultat : une erreur d'analyse, car while(1); n'est pas un JSON valide.



fetch('https://api.google.com/some-endpoint')  .then(response => response.text())  .then(data => {    // Erreur ! JSON.parse va échouer    const parsed = JSON.parse(data);    console.log(parsed);  })  .catch(err => console.error('Erreur d\'analyse :', err));


Comment l'éviter : Supprimez toujours le préfixe while(1); avant l'analyse.



fetch('https://api.google.com/some-endpoint')  .then(response => response.text())  .then(data => {    // Supprimer le préfixe de protection    const cleanJson = data.replace(/^\\)?\\s*while\\s*\\(\\s*1\\s*\\)\\s*;\\s*/, '');    const parsed = JSON.parse(cleanJson);    console.log(parsed);  })  .catch(err => console.error('Erreur d\'analyse :', err));


Erreur n°2 : Utiliser response.json() sans traitement



La méthode response.json() dans l'API Fetch attend un JSON pur. Si le serveur renvoie while(1);..., alors response.json() lèvera une exception. Les développeurs pensent souvent qu'il s'agit d'un bug de l'API, et non d'une particularité de sécurité.



// Ce code échouera avec l'erreur "Unexpected token w"fetch('https://api.google.com/endpoint')  .then(response => response.json()) // Erreur !  .then(data => console.log(data));


Comment l'éviter : Utilisez response.text() puis supprimez manuellement le préfixe.



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


Erreur

Blogs

Book Recommendations