JSONP

شعار رسومي لـ JSONP
شعار رسومي لـ JSONP

JSONP ، أو JSON-P (JSON مع الحشو)، هي تقنية جافا سكريبت لطلب البيانات عبر <script>عنصر HTML . [ 1 ] اقترحها بوب إيبوليتو عام 2005. [ 2 ] تُمكّن JSONP من مشاركة البيانات متجاوزةً سياسة المصدر نفسه، التي تمنع تشغيل كود جافا سكريبت من قراءة عناصر DOM الخاصة بالوسائط أو بيانات XMLHttpRequest المُسترجعة من خارج الموقع الأصلي للصفحة. يُشار إلى الموقع الأصلي بمزيج من مخطط URI واسم المضيف ورقم المنفذ .

تعتبر طلبات JSONP عرضة لرد مصدر البيانات برمز ضار، ولهذا السبب تم تحسينها بواسطة CORS ( مشاركة الموارد عبر المصادر ، المتاحة منذ عام 2009 [ 3 ] ) في التطبيقات الحديثة.

الوظائف

يُسمح عمومًا لعنصر HTML بتنفيذ كود جافا سكريبت المُسترجع من مصادر خارجية. قبل اعتماد CORS، لم تكن الخدمات التي ترد ببيانات JSON خالصة قادرة على مشاركة البيانات من مصادر خارجية.<script>

على سبيل المثال، قد يُعيد طلب CORS إلى خدمة خارجية http://server.example.com/Users/1234استجابة JSON. ومع ذلك، فإن محاولة استخدام البيانات عبر نطاقات مختلفة بدون CORS تؤدي إلى خطأ في جافا سكريبت.

عند http://server.example.com/Users/1234تمرير قيمة إلى srcخاصية عنصر <script>، يقوم المتصفح بتنزيل الملف، وتقييم محتوياته، وتفسير بيانات JSON الخام بشكل خاطئ على أنها كتلة، مما يؤدي إلى ظهور خطأ في بناء الجملة. حتى لو تم تفسير بيانات JSON الخام على أنها كائن جافا سكريبت حرفي، فإن الكائنات الحرفية غير قابلة للوصول بدون تعيين متغير لها.

يحلّ JSONP هذه المشكلة من خلال اتفاق العميل والخادم على وسيط استعلام مُشفّر في عنوان URL، عادةً ما يكون `<?json>` jsonpأو callback`<?json>`، حيث يستخدمه العميل لتحديد نص يُضيفه الخادم إلى بداية استجابته، ويُغلّف حمولة JSON بين قوسين، مما ينتج عنه مستند JavaScript. عند تمرير عنوان URL المُشفّر إلى سمة `<?json>` srcللعنصر `<? json>`، يُرسل العميل طلب JSONP، ويتم تحميل مستند JavaScript الخاص باستجابة الخادم في المتصفح. يُستخدم هذا عادةً لاستدعاء دالة مُعرّفة في بيئة JavaScript ومعالجة بيانات JSON في الاستجابة.<script>

مثال على طلب JSONP إلىhttp://server.example.com/Users/1234

<script type="application/javascript" src="<nowiki>http://server.example.com/Users/1234?jsonp=parseResponse</nowiki>"> </script>

في هذا المثال، يُعرّف العميل parseResponseالنص المُضاف في البداية. وستكون استجابة الخادم كالتالي:

parseResponse({"Name": "Foo", "Id": 1234, "Rank": 7});

هنا، parseResponse()يوجد حرف "P" في JSONP - وهو "الحشو" المحيط ببيانات JSON الأصلية. [ 4 ]

حقن عنصر البرنامج النصي

لا يُجدي استخدام JSONP إلا مع عنصر برمجي. مع كل طلب JSONP جديد، يجب على المتصفح إضافة عنصر جديد، أو إعادة استخدام عنصر موجود. الخيار الأول - إضافة عنصر برمجي جديد - يتم عبر معالجة DOM الديناميكية، ويُعرف باسم حقن العنصر البرمجي . يُحقن العنصر في DOM الخاص بـ HTML، مع تعيين عنوان URL لنقطة نهاية JSONP المطلوبة كسمة . عادةً ما يتم حقن العنصر البرمجي الديناميكي هذا بواسطة مكتبة مساعدة JavaScript. تحتوي jQuery وأطر العمل الأخرى على دوال مساعدة لـ JSONP؛ كما توجد خيارات مستقلة.<script><script>src

مثال على استخدام jQuery لإدخال عنصر برمجي ديناميكيًا لاستدعاء JSONP يبدو كالتالي:

$ .getScript ( "http://server.example.com/Users/192.168.73.96?callback=parseResponse" ) ;

بعد حقن العنصر، يقوم المتصفح بتقييمه، ثم يُجري طلب HTTP GET على عنوان URL المصدر، ويسترجع المحتوى. بعد ذلك، يُحلل المتصفح البيانات المُسترجعة ككود جافا سكريبت. عادةً ما يكون هذا استدعاءً لدالة. وبهذه الطريقة، يُمكن استخدام JSONP لتمكين صفحات المتصفح من تجاوز سياسة المصدر نفسه عبر حقن عناصر البرمجة النصية. [ 5 ]

يعمل البرنامج النصي ضمن نطاق الصفحة المُضمِّنة، وبالتالي يخضع لقيود النطاقات المختلفة بالنسبة لنطاق تلك الصفحة. هذا يعني أنه لا يمكن لصفحة ويب، على سبيل المثال، تحميل مكتبة مُستضافة على موقع آخر عبر JSONP ثم إرسال طلبات XMLHttpRequest إلى ذلك الموقع (إلا إذا كان دعم مشاركة الموارد عبر النطاقات (CORS) مُفعَّلاً)، مع العلم أنه يُمكن استخدام هذه المكتبة لإرسال طلبات XMLHttpRequest إلى الموقع نفسه.

مخاوف أمنية

رمز طرف ثالث غير موثوق به

يُتيح تضمين عناصر برمجية من خوادم بعيدة لهذه الخوادم إمكانية حقن أي محتوى في موقع الويب. إذا كانت هذه الخوادم البعيدة تعاني من ثغرات أمنية تسمح بحقن جافا سكريبت، فإن الصفحة المُقدمة من الخادم الأصلي تكون أكثر عرضة للخطر. إذا تمكن المهاجم من حقن أي جافا سكريبت في صفحة الويب الأصلية، فسيتمكن هذا الكود من استرداد جافا سكريبت إضافية من أي نطاق، متجاوزًا بذلك سياسة المصدر نفسه . [ 6 ] يسمح رأس HTTP الخاص بسياسة أمان المحتوى (CSP) لمواقع الويب بإخبار متصفحات الويب بالنطاقات التي يُسمح بتضمين البرامج النصية منها.

بُذلت جهودٌ في عام 2011 تقريبًا لوضع تعريفٍ أكثر أمانًا لمجموعة فرعية صارمة من JSONP [ 1 ] ، بحيث تتمكن المتصفحات من فرضه على طلبات البرامج النصية ذات نوع MIME محدد ، مثل "application/json-p". إذا لم يتم تحليل الاستجابة كـ JSONP صارم، كان بإمكان المتصفح إظهار خطأ أو تجاهل الاستجابة بالكامل. مع ذلك، تم التخلي عن هذا النهج لصالح CORS ، وبقي نوع MIME الصحيح لـ JSONP كما هو application/javascript. [ 7 ]

اختلافات المساحات البيضاء

واجهت JSONP نفس مشاكل معالجة JSON eval(): فكلاهما يفسر نص JSON على أنه جافا سكريبت، مما أدى إلى اختلافات في التعامل مع U+2028 ( فاصل الأسطر ) وU+2029 ( فاصل الفقرات ) في JSON نفسه. ونتيجةً لذلك، أصبحت بعض سلاسل JSON غير صالحة في JSONP؛ إذ كان على الخوادم التي تقدم JSONP تهريب هذه الأحرف قبل الإرسال. [ 8 ] وقد تم حل هذه المشكلة الآن في ES2019. [ 9 ]

التلاعب بأسماء الاستدعاءات وهجوم تنزيل الملفات المنعكسة

يمكن استخدام أسماء الاستدعاء غير المنقحة لتمرير البيانات الضارة إلى العملاء، متجاوزة القيود المرتبطة application/jsonبنوع المحتوى، كما هو موضح في هجوم تنزيل الملفات المنعكسة (RFD) من عام 2014. [ 10 ]

يمكن أيضًا حقن نقاط نهاية JSONP غير الآمنة ببيانات ضارة. [ 11 ]

تزوير الطلبات عبر المواقع

تُعدّ التطبيقات البسيطة لتقنية JSONP عرضةً لهجمات تزوير الطلبات عبر المواقع (CSRF أو XSRF). [ 12 ] ولأن عنصر HTML لا يلتزم بسياسة المصدر نفسه في متصفحات الويب ، يُمكن لصفحة خبيثة طلب بيانات JSON من موقع آخر والحصول عليها. وهذا يسمح بتقييم البيانات المشفرة بصيغة JSON في سياق الصفحة الخبيثة، مما قد يؤدي إلى كشف كلمات المرور أو غيرها من البيانات الحساسة إذا كان المستخدم مسجلاً دخوله إلى الموقع الآخر.<script>

روزيتا فلاش

Rosetta Flash هي تقنية استغلال تسمح للمهاجم باختراق الخوادم التي تحتوي على نقطة نهاية JSONP ضعيفة، وذلك عن طريق جعل Adobe Flash Player يعتقد أن تطبيق Flash صغيرًا (Applet) مُحددًا من قِبل المهاجم قد نشأ على الخادم المُعرّض للخطر. يُطبّق Flash Player سياسة المصدر نفسه، مما يسمح بإرسال الطلبات (باستخدام ملفات تعريف الارتباط) واستقبال الاستجابات من الموقع المُضيف. بعد ذلك، يُمكن للتطبيق الصغير إرسال البيانات المُسترجعة إلى المهاجم. يُعدّ هذا استغلالًا عبر المصادر، وله تأثير مُشابه لتضمين تطبيق Flash صغير عشوائي في النطاق المُعرّض للخطر. يستخدم الاستغلال حمولة ActionScript مُجمّعة في ملف SWF مُكوّن بالكامل من أحرف وأرقام، وذلك عن طريق إنشاء دفق zlib برأس مُحدد وكتل DEFLATE باستخدام ترميز Huffman مُخصص . ثم يُستخدم ملف SWF الناتج، الذي يحتوي على أحرف وأرقام فقط، كمعامل رد نداء لاستدعاء JSONP. كانت مواقع شهيرة مثل جوجل، ويوتيوب ، وتويتر ، وياهو!، وياندكس، ولينكدإن ، وإيباي، وجيت هاب، وإنستغرام ، وتامبلر، جميعها عرضة للاختراق حتى يوليو 2014. [ 13 ] اكتشف هذه الثغرة الأمنية في البداية إيرلينغ وألوك مينغراجاني، وقدّما عرضًا عامًا لها في مؤتمر أمني. ثم قام غابور مولنار بتحسين استغلال هذه الثغرة. وقد صاغ مهندس أمن جوجل، ميشيل سبانيولو، مصطلح "الثغرة الأمنية" [ 14 ] ، ولها معرفات CVE - 2014-4671 [ 15 ] و CVE- 2014-5333 . [ 16 ] قدم الإصدار 14.0.0.145 من Adobe Flash Player، الذي صدر في 8 يوليو 2014، تحققًا أقوى من ملفات Flash، [ 17 ] وفي الإصدار 14.0.0.176، الذي صدر في 12 أغسطس 2014، تم الانتهاء من الإصلاح، [ 18 ] مما منع هذا الاستغلال من العمل.

قبل إصلاح Adobe، كان بإمكان مواقع الويب حماية نفسها عن طريق إضافة تعليق JavaScript فارغ (/**/) أو حتى مجرد سطر جديد كأول بايتات من استجابة JSONP.

تاريخ

في يوليو 2005، اقترح جورج جيمبتي إضافة تعيين متغير اختياري في بداية JSON. [ 19 ] [ 20 ] ويبدو أن الاقتراح الأصلي لـ JSONP، حيث تكون الحشوة عبارة عن دالة رد نداء، قد قدمه بوب إيبوليتو في ديسمبر 2005 [ 21 ] ويستخدم الآن من قبل العديد من تطبيقات Web 2.0 مثل Dojo Toolkit و Google Web Toolkit .

انظر أيضاً

مراجع

  1. 1 2 "أَجْرَفٌ أَمَامَيَّةٌ لِتَوَاصِلِ الأَجْرَاكِيَّةِ بِجْنُون-ب/جْنُونْب" . JSON-P.org . أُرْسِخَ مِنَ الأَصْلِيَّةِ فِي 4 مارس 2016. تَحْتَرِكُ فِي 30 أكتوبر 2011 .
  2. إيبوليتو، بوب (5 ديسمبر 2005). "JSON عن بُعد - JSONP" . بوب إيبوليتو يتحدث عن هاسكل، بايثون، إرلانج، جافا سكريبت، إلخ . مؤرشف من الأصل في 8 يونيو 2012. تم الاطلاع عليه في 10 فبراير 2017 .
  3. "مشاركة الموارد عبر المصادر" . هل يمكنني استخدامها؟... تم الاطلاع عليها بتاريخ 4 مايو 2020 .
  4. "مترجم تجريبي لمجموعة نتائج RDF إلى JSON" . مؤرشف من الأصل في 15 نوفمبر 2014. تم الاطلاع عليه في 20 فبراير 2012 .
  5. "كيف يعمل JSONP فعليًا؟ بعض الأمثلة البسيطة" . جيسون شوك . 5 فبراير 2013. مؤرشف من الأصل في 26 ديسمبر 2021. تم الاطلاع عليه في 26 ديسمبر 2021 .
  6. ^ بن حياك (17 أكتوبر 2014). "نفس طريقة التنفيذ الأصلية" (PDF) . تم الاسترجاع 22 أكتوبر 2014 .
  7. غراي، إيلي (27 يونيو 2010). "هل هذا آمن لتوفير JSONP؟" . stackoverflow.com . تم الاطلاع عليه في 7 سبتمبر 2012 .
  8. "JSON: مجموعة فرعية من جافا سكريبت ليست كذلك" . ماغنوس هولم. مؤرشف من الأصل في 13 مايو 2012. تم الاطلاع عليه في 16 مايو 2011 .
  9. "احتوي على JSON (المعروف أيضًا باسم JSON ⊂ ECMAScript)" . جيثب . 24 أكتوبر 2022 . تم الاسترجاع في 24 أكتوبر 2022 .
  10. أورين حفيف (2014). "تنزيل الملفات المنعكسة - أسلوب هجوم جديد على الويب" . TrustWave . تم الاطلاع عليه بتاريخ 25 مارس 2015 .
  11. "حقن JSONP عملي" . 18 يناير 2017.
  12. جروسمان، جيريميا (27 يناير 2006). "تقنيات متقدمة للهجوم على الويب باستخدام جيميل" . تم الاطلاع عليه في 3 يوليو 2009 .
  13. ميشيل، سبانيولو. "إساءة استخدام JSONP مع Rosetta Flash" . مؤرشف من الأصل في 21 يوليو 2014. تم الاطلاع عليه في 20 يوليو 2014 .
  14. "جوجل - قائمة بثغرات البرامج التي اكتشفها أو أصلحها موظفو جوجل" . تم الاطلاع عليه بتاريخ 29 يوليو 2014 .
  15. "MITRE: CVE-2014-4671" . تم الاطلاع عليه بتاريخ 29 يوليو 2014 .
  16. "MITRE: CVE-2014-5333" . تم الاطلاع عليه بتاريخ 21 أغسطس 2014 .
  17. "نشرة أمان أدوبي APSB14-17" . تم الاطلاع عليها بتاريخ 29 يوليو 2014 .
  18. "نشرة أمان أدوبي APSB14-18" . تم الاطلاع عليها بتاريخ 21 أغسطس 2014 .
  19. "تقييم JSON" . 19 يوليو 2005. مؤرشف من الأصل في 12 فبراير 2006.
  20. "json: Message: Re: Comments" . 17 أغسطس 2005.{{cite web}}: CS1 maint: deprecated archiveal service ( link )
  21. "JSON عن بُعد - JSONP" . من __future__ استيراد * . Bob.pythonmac.org. 5 ديسمبر 2005. مؤرشف من الأصل في 4 ديسمبر 2009. تم الاسترجاع في 8 سبتمبر 2008 .