مشاركة الموارد عبر المناطق

في مجال الحوسبة، تعد مشاركة الموارد عبر المصادر ( CORS ) آلية لتجاوز سياسة المصدر نفسه بأمان ؛ أي أنها تسمح لصفحة الويب بالوصول إلى الموارد المقيدة من خادم ويب على اسم نطاق مختلف عن النطاق الذي قدم صفحة الويب.

يمكن لصفحة الويب تضمين الصور، وأوراق الأنماط ، والبرامج النصية ، والإطارات المضمنة ، ومقاطع الفيديو من مصادر مختلفة بحرية . وتُحظر بعض طلبات HTTP "عبر النطاقات" ، وخاصة طلبات Ajax ، افتراضيًا بموجب سياسة أمان المصدر نفسه. يُحدد CORS آليةً لتفاعل متصفح الويب والخادم لتحديد ما إذا كان من الآمن السماح بطلب من مصدر مختلف. [ 1 ] يُتيح هذا مزيدًا من الحرية والوظائف مقارنةً بطلبات المصدر نفسه، ولكنه أكثر أمانًا من السماح بجميع طلبات المصادر المختلفة.

تُدرج مواصفات CORS كجزء من معيار Fetch Living Standard التابع لمجموعة عمل WHATWG . [ 2 ] وتصف هذه المواصفات كيفية تطبيق CORS حاليًا في المتصفحات. [ 3 ] وقد نُشرت مواصفات سابقة كتوصية من W3C . [ 4 ]

نظرة عامة فنية

مسار طلب XMLHttpRequest (XHR) عبر CORS

بالنسبة لطلبات HTTP المُرسلة من جافا سكريبت والتي لا يمكن إرسالها باستخدام وسم <form> يشير إلى نطاق آخر أو يحتوي على رؤوس غير مُدرجة في القائمة الآمنة، يُلزم المعيار المتصفحات بإجراء "فحص مسبق" للطلب، وذلك باستطلاع الطرق المدعومة من الخادم باستخدام طريقة طلب HTTP OPTIONS، ثم، عند "موافقة" الخادم، إرسال الطلب الفعلي باستخدام طريقة طلب HTTP الفعلية. كما يمكن للخوادم إخطار العملاء بما إذا كان ينبغي إرسال "بيانات الاعتماد" (بما في ذلك ملفات تعريف الارتباط وبيانات مصادقة HTTP) مع الطلبات. [ 5 ]

مثال بسيط للطلب

لنفترض أن مستخدمًا زار الموقع http://www.example.com وحاولت الصفحة إرسال طلب من موقع آخر لجلب البيانات من الموقع http://service.example.com . سيحاول متصفح متوافق مع CORS إرسال طلب من موقع آخر إلى service.example.com كما يلي.

  1. يرسل المتصفح طلب GET مع Originرأس HTTP إضافي إلى service.example.com يحتوي على النطاق الذي قدم الصفحة الأصلية:
    المصدر: http://www.example.com
  2. يقوم الخادم الموجود على service.example.com بإرسال أحد هذه الاستجابات الثلاث:
    • يُسمح بالبيانات المطلوبة مع Access-Control-Allow-Originتضمين ترويسة (ACAO) في الاستجابة، مما يشير إلى أن الطلبات واردة من المصدر. على سبيل المثال، في هذه الحالة، يجب أن يكون كالتالي:
      Access-Control-Allow-Origin: http://www.example.com
    • البيانات المطلوبة بالإضافة إلى Access-Control-Allow-Originرأس (ACAO) مع رمز بدل يشير إلى السماح بالطلبات من جميع النطاقات:
      Access-Control-Allow-Origin: *
    • صفحة خطأ إذا لم يسمح الخادم بطلب من مصدر مختلف [ 6 ]

تُعدّ سياسة الوصول من نفس المصدر باستخدام الأحرف البديلة مناسبة عندما يكون الهدف من صفحة أو استجابة واجهة برمجة التطبيقات (API) هو إتاحة الوصول إليها لأي كود على أي موقع. ومن الأمثلة على ذلك استخدام خط ويب مجاني متاح على خدمة استضافة عامة مثل Google Fonts .

تتميز قيمة "*" بأنها لا تسمح بتضمين بيانات الاعتماد في الطلبات، مما يعني أنها لا تسمح بإرسال مصادقة HTTP أو شهادات SSL من جانب العميل أو ملفات تعريف الارتباط في طلب النطاقات المتعددة. [ 7 ]

لاحظ أنه في بنية CORS، يتم تعيين رأس Access-Control-Allow-Origin بواسطة خدمة الويب الخارجية ( service.example.com )، وليس بواسطة خادم تطبيق الويب الأصلي ( www.example.com ). هنا، تستخدم service.example.com بروتوكول CORS للسماح للمتصفح بتفويض www.example.com لإرسال طلبات إلى service.example.com .

إذا حدد موقع ما العنوان "Access-Control-Allow-Credentials:true"، فقد تتمكن مواقع الطرف الثالث من تنفيذ إجراءات مميزة واسترداد معلومات حساسة.

مثال ما قبل الرحلة

عند تنفيذ أنواع معينة من طلبات Ajax عبر النطاقات، تُرسل المتصفحات الحديثة التي تدعم CORS طلبًا إضافيًا "مسبقًا" للتحقق من امتلاكها صلاحية تنفيذ الإجراء. ويتم التحقق من الطلبات عبر النطاقات بهذه الطريقة لأنها قد تؤثر على بيانات المستخدم.

خيارات / المضيف: service.example.com المصدر: http://www.example.com طريقة طلب التحكم في الوصول: PUT 

إذا كان موقع service.example.com مستعدًا لقبول الإجراء، فقد يستجيب بالعناوين التالية:

Access-Control-Allow-Origin: http://www.example.com Access-Control-Allow-Methods: PUT 

سيقوم المتصفح بعد ذلك بإرسال الطلب الفعلي. إذا كان موقع service.example.com لا يقبل الطلبات من مواقع أخرى من هذا المصدر، فسيرد برسالة خطأ على طلب OPTIONS ولن يقوم المتصفح بإرسال الطلب الفعلي.

العناوين

رؤوس HTTP المتعلقة بـ CORS هي:

رؤوس الطلب

  • Origin
  • Host
  • Access-Control-Request-Method
  • Access-Control-Request-Headers

رؤوس الاستجابة

  • Access-Control-Allow-Origin
  • Access-Control-Allow-Credentials
  • Access-Control-Expose-Headers
  • Access-Control-Max-Age
  • Access-Control-Allow-Methods
  • Access-Control-Allow-Headers

دعم المتصفح

يدعم جميع المتصفحات التي تعتمد على محركات التخطيط التالية تقنية CORS:

تاريخ

اقترح مات أوشري وبراد بورتر ومايكل بوديل من شركة Tellme Networks دعم الوصول من مصادر متعددة في مارس 2004 لإدراجه في VoiceXML 2.1 [ 19 وذلك للسماح لمتصفحات VoiceXML بإرسال طلبات بيانات آمنة من مصادر متعددة. وُصفت الآلية بأنها عامة وليست خاصة بـ VoiceXML، فتم فصلها لاحقًا في ملاحظة تنفيذية [ 20 ] . بدأ فريق عمل تطبيقات الويب التابع لاتحاد شبكة الويب العالمية (W3C)، بمشاركة كبرى شركات تصنيع المتصفحات، في صياغة الملاحظة وتحويلها إلى مسودة عمل معتمدة من W3C، تمهيدًا لاعتمادها كتوصية رسمية من W3C .

في مايو 2006، قُدِّمَت المسودة الأولى لمشروع W3C. [ 21 ] وفي مارس 2009، أُعيد تسمية المسودة إلى "مشاركة الموارد عبر المصادر" [ 22 ] ، وفي يناير 2014، قُبِلَت كتوصية من W3C. [ 23 ]

مقارنة بين CORS و JSONP

كانت الميزة الرئيسية لـ JSONP هي قدرتها على العمل على المتصفحات القديمة التي سبقت دعم CORS (مثل Opera Mini و Internet Explorer 9 والإصدارات الأقدم). يدعم معظم متصفحات الويب الحديثة CORS الآن، [ 24 ] ويمكن استخدامه كبديل حديث لنمط JSONP . وتشمل فوائد CORS ما يلي:

  • بينما يدعم JSONP GETطريقة الطلب فقط، فإن CORS يدعم أيضًا أنواعًا أخرى من طلبات HTTP.
  • تتيح CORS لمبرمج الويب استخدام XMLHttpRequest العادي ، والذي يدعم معالجة الأخطاء بشكل أفضل من JSONP.
  • على الرغم من أن بروتوكول JSONP قد يتسبب في مشاكل البرمجة النصية عبر المواقع (XSS) عند اختراق الموقع الخارجي، فإن بروتوكول CORS يسمح للمواقع الإلكترونية بتحليل الاستجابات يدويًا لزيادة الأمان. [ 1 ]

انظر أيضاً

مراجع

  1. 1 2 "Ajax عبر النطاقات مع مشاركة الموارد عبر المصادر" . NCZOnline. 25 مايو 2010. تم الاسترجاع في 5 يوليو 2012 .
  2. "جلب مستوى المعيشة" .
  3. "محضر اجتماع مجموعة عمل WebAppSec" .
  4. "مشاركة الموارد عبر المصادر" .
  5. "مشاركة الموارد عبر النطاقات (CORS) - HTTP | MDN" . developer.mozilla.org . 10 مايو 2023. تم الاطلاع عليه في 7 يونيو 2023 .
  6. "أخطاء CORS - HTTP | MDN" . developer.mozilla.org . 2023-05-10 . تم الاطلاع عليه بتاريخ 2023-07-04 .
  7. W3.org. تم الاطلاع عليه بتاريخ 2021-31-07.
  8. 1 2 "وميض" . مدونة كويركس. أبريل 2013. تم الاطلاع عليه في 4 أبريل 2013 .
  9. "جوجل تسلك طريقها الخاص، وتُطوّر محرك عرض WebKit" . آرس تكنيكا. أبريل 2013. تاريخ الاطلاع: 4 أبريل 2013 .
  10. "التحكم في الوصول عبر بروتوكول HTTP (CORS) - MDN" . Developer.mozilla.org. مؤرشف من الأصل بتاريخ 27-05-2010 . تم الاطلاع عليه بتاريخ 05-07-2012 .
  11. "Gecko - MDN" . Developer.mozilla.org. 2012-06-08. مؤرشف من الأصل في 2012-08-03 . تم الاطلاع عليه في 2012-07-05 .
  12. توني روس؛ مدير برنامج؛ إنترنت إكسبلورر (9 فبراير 2012). "CORS لطلبات XHR في IE10" . MSDN . تم الاطلاع عليه بتاريخ 14 ديسمبر 2012 .
  13. "طلب XML HTTP عبر المواقع مع CORS" . موزيلا . تم الاسترجاع في 2012-09-05 .
  14. ديفيد هونيفر، أخصائي توثيق (14 يونيو 2012). "سجل تغييرات الإصدار 12.00 لنظام يونكس" . أوبرا. مؤرشف من الأصل بتاريخ 18 يونيو 2012. تم الاطلاع عليه بتاريخ 5 يوليو 2012 .
  15. ديفيد هونيفر، أخصائي توثيق (23 أبريل 2012). "برنامج أوبرا: دعم مواصفات الويب في أوبرا بريستو 2.10" . Opera.com . تاريخ الاسترجاع: 5 يوليو 2012 .
  16. في 6 يوليو 2009، بقلم أرون رانغاناثان (2009-07-06). "طلب XML HTTP عبر المواقع مع CORS ✩ مدونة موزيلا هاكس - مدونة مطوري الويب" . Hacks.mozilla.org . تم الاطلاع عليه في 2012-07-05 .{{cite web}}: صيانة CS1: الأسماء الرقمية: قائمة المؤلفين ( رابط )
  17. "59940: تجاوز مشاركة الموارد عبر النطاقات في متصفح Apple Safari WebKit" . Osvdb.org . تم الاطلاع عليه بتاريخ 2012-07-05 .{{cite web}}: CS1 maint: deprecated archiveal service ( link )
  18. "دليل مطوري مايكروسوفت إيدج" . 21 ديسمبر 2023.
  19. "لغة ترميز الصوت القابلة للتوسيع (VoiceXML) 2.1" . W3.org. 2004-03-23 . تم الاطلاع عليه بتاريخ 2012-07-05 .
  20. "السماح بالوصول للقراءة إلى محتوى XML باستخدام تعليمات المعالجة <?access-control?> 1.0" . W3.org . تم الاطلاع عليه بتاريخ 2012-07-05 .
  21. "تفويض الوصول للقراءة إلى محتوى XML باستخدام تعليمات المعالجة <?access-control?> 1.0 W3C - مسودة عمل 17 مايو 2006" . W3.org . تم الاطلاع عليه في 17 أغسطس 2015 .
  22. "مشاركة الموارد عبر المصادر - مسودة عمل W3C بتاريخ 17 مارس 2009" . W3.org . تم الاطلاع عليه بتاريخ 17 أغسطس 2015 .
  23. "مشاركة الموارد عبر المصادر - توصية اتحاد شبكة الويب العالمية 16 يناير 2014" . W3.org . تم الاطلاع عليه بتاريخ 17 أغسطس 2015 .
  24. "متى يمكنني استخدام... مشاركة الموارد عبر المصادر" . caniuse.com . تم الاطلاع عليه بتاريخ 12-07-2012 .