لماذا تدرج Google while(1); في JSON وكيف لا تقع في الفخ

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

لماذا تدرج Google while(1); في JSON وكيف لا تقع في الفخ: أهم أخطاء مطوري JavaScript



إذا كنت قد ألقيت نظرة على وحدة تحكم المطور أثناء العمل مع Google API أو ببساطة بحثت عن استجابات غريبة من الخادم، فمن المحتمل أنك لاحظت شيئاً كهذا:



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


يبدو وكأنه حلقة لا نهائية ستعلق المتصفح، أليس كذلك؟ لكن في الحقيقة هذه آلية دفاعية عبقرية. دعنا نفهم لماذا تسبق Google JSON بـ while(1)، وما الأخطاء التي يرتكبها المطورون عند التعامل مع هذه الاستجابات وكيفية تجنبها.



هذا السؤال هو واحد من أكثر الأسئلة شيوعاً على Stack Overflow (آلاف المشاهدات)، وليس بدون سبب. فهو لا يتطرق فقط إلى التفاصيل التقنية، بل أيضاً إلى المبادئ الأساسية لأمان الويب.



ما هو while(1); في JSON ومن أين أتى؟



لنبدأ بالأهم. Google تسبق JSON بـ while(1) ليس لكسر الكود الخاص بك، بل للحماية من هجوم يسمى اختطاف JSON.



تخيل الأيام الخوالي عندما كانت المواقع تستخدم مصفوفات JSON من المستوى الأعلى (مثل [{"user":"admin","token":"secret"}]). كان بإمكان المهاجم إعادة تعريف المنشئ العام Array أو Object وسرقة البيانات عبر وسم <script>. كان المتصفح ينفذ JSON كـ JavaScript، فتتسرب البيانات.



حل Google هو إضافة البادئة while(1);. هذا يجعل JSON غير صالح كـ JavaScript (الحلقة اللانهائية تمنع تنفيذ السكريبت الضار)، لكن JSON نفسه يبقى صحيحاً - فقط يجب تحليله بشكل صحيح بعد إزالة البادئة.



الآن أصبحت هذه الممارسة معياراً أمنياً للعديد من واجهات API الكبيرة. لكن إذا كنت لا تعرف عنها، فقد يتعطل الكود الخاص بك.



أهم 5 أخطاء لمطوري JavaScript عند التعامل مع JSON المحمي



الخطأ رقم 1: محاولة تحليل الاستجابة كما هي



الخطأ الأكثر شيوعاً - يحصل المطور على استجابة من الخادم ويمررها فوراً إلى JSON.parse(). النتيجة - خطأ في التحليل لأن while(1); ليس JSON صالحاً.



fetch('https://api.google.com/some-endpoint')  .then(response => response.text())  .then(data => {    // خطأ! JSON.parse سيفشل    const parsed = JSON.parse(data);    console.log(parsed);  })  .catch(err => console.error('خطأ في التحليل:', err));


كيف تتجنبه: احذف دائماً البادئة while(1); قبل التحليل.



fetch('https://api.google.com/some-endpoint')  .then(response => response.text())  .then(data => {    // إزالة البادئة الواقية    const cleanJson = data.replace(/^\\)?\\s*while\\s*\\(\\s*1\\s*\\)\\s*;\\s*/, '');    const parsed = JSON.parse(cleanJson);    console.log(parsed);  })  .catch(err => console.error('خطأ في التحليل:', err));


الخطأ رقم 2: استخدام response.json() بدون معالجة



طريقة response.json() في Fetch API تتوقع JSON نقياً. إذا أعاد الخادم while(1);...، فإن response.json() سيرمي استثناءً. غالباً ما يعتقد المطورون أن هذا خطأ في API وليس ميزة أمان.



// هذا الكود سيفشل مع خطأ "Unexpected token w"fetch('https://api.google.com/endpoint')  .then(response => response.json()) // خطأ!  .then(data => console.log(data));


كيف تتجنبه: استخدم response.text() ثم احذف البادئة يدوياً.



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


الخطأ

المدونات

توصيات الكتب