ما المقصود بمشاركة الموارد عبر الأصول؟
تعد مشاركة الموارد عبر المصادر (CORS) آلية لدمج التطبيقات. تحدد CORS طريقة لتطبيقات الويب الخاصة بالعميل التي يتم تحميلها في مجال واحد للتفاعل مع الموارد في مجال مختلف. يعد هذا مفيدًا لأن التطبيقات المعقدة غالبًا ما تشير إلى واجهات برمجة تطبيقات (APIs) وموارد تابعة لجهات خارجية في التعليمات البرمجية من جانب العميل. على سبيل المثال، قد يستخدم التطبيق متصفحك لسحب مقاطع الفيديو من واجهة برمجة تطبيقات منصة الفيديو، أو يستخدم الخطوط من مكتبة الخطوط العامة، أو يعرض بيانات الطقس من قاعدة بيانات الطقس الوطنية. تسمح CORS لمتصفح العميل بالتحقق من خوادم الطرف الثالث إذا كان الطلب مصرحًا به قبل أي عمليات نقل للبيانات.
لماذا تُعد مشاركة الموارد عبر الأصول مهمة؟
في الماضي، عندما كانت تقنيات الإنترنت لا تزال جديدة، حدثت مشكلات تزييف الطلبات عبر المواقع (CSRF). أدت هذه المشكلات إلى إرسال طلبات عملاء وهمية من متصفح الضحية إلى تطبيق آخر.
على سبيل المثال، سجلت الضحية الدخول إلى تطبيق البنك الخاص بها. ثم جرى خداعها لتحميل موقع ويب خارجي على علامة تبويب متصفح جديدة. ثم استخدم موقع الويب الخارجي بيانات اعتماد ملفات تعريف الارتباط الخاصة بالضحية ونقل البيانات إلى تطبيق البنك في أثناء التظاهر بأنه الضحية. ثم حصل المستخدمون غير المصرح لهم على وصول غير مقصود إلى تطبيق البنك.
لمنع مشكلات تزييف الطلبات عبر المواقع (CSRF) هذه، تطبق جميع المتصفحات حاليًا سياسة الأصل الأوحد.
سياسة الأصل الأوحد
اليوم، تفرض المتصفحات ألا يمكن للعملاء إلا إرسال الطلبات إلى مورد له أصل عنوان URL الخاص نفسه بالعميل. يجب أن يتطابق البروتوكول والمنفذ واسم المضيف لعنوان URL الخاص بالعميل مع الخادم الذي يطلبه.
على سبيل المثال، ضع في اعتبارك مقارنة الأصل لعناوين URL أدناه مع عنوان URL الخاص بالعميل http://store.aws.com/dir/page.html.
URL |
النتيجة |
السبب |
http://store.aws.com/dir2/new.html |
أصل أوحد |
اختلاف المسار فقط |
http://store.aws.com/dir/inner/other.html |
أصل أوحد |
اختلاف المسار فقط |
https://store.aws.com/page.html |
أصل مختلف |
بروتوكول مختلف |
http://store.aws.com:81/dir/page.html |
أصل مختلف |
منفذ مختلف (http:// هو المنفذ 80 افتراضيًا) |
http://news.aws.com/dir/page.html |
أصل مختلف |
مضيف مختلف |
لذا، فإن سياسة الأصل الأوحد آمنة للغاية ولكنها غير مرنة لحالات الاستخدام الحقيقية.
تُعد مشاركة الموارد عبر الأصول (CORS) امتدادًا لسياسة الأصل الأوحد. إنك بحاجة إليها لمشاركة الموارد المصرح بها مع جهات خارجية. على سبيل المثال، تحتاج إلى مشاركة الموارد عبر المصادر (CORS) عندما تريد سحب البيانات من واجهات برمجة التطبيقات (API) الخارجية العامة أو المصرح بها. وتحتاج إليها أيضًا إذا كنت تريد السماح بالوصول المصرح به من جهة خارجية إلى موارد الخادم الخاصة بك.
كيف تعمل مشاركة الموارد عبر الأصول؟
في اتصال الإنترنت القياسي، يرسل متصفحك طلب بروتوكول نقل نص تشعبي (HTTP) إلى خادم التطبيق، ويتلقى البيانات في صورة استجابة بروتوكول نقل نص تشعبي (HTTP)، ويعرضها. في مصطلحات المتصفح، يُسمى عنوان URL الحالي للمتصفح الأصل الحالي ويُسمى عنوان URL الجهة الخارجية عبر الأصول.
عندما تقدم طلبًا من نوع عبر الأصول، تكون هذه هي عملية الاستجابة للطلب:
- يضيف المتصفح رأس الأصل إلى الطلب مع معلومات حول بروتوكول الأصل الحالي ومضيفه ومنفذه
- يفحص الخادم رأس الأصل الحالي ويستجيب بالبيانات المطلوبة ورأس Access-Control-Allow-Origin (أصل السماح بالتحكم في الوصول)
- يرى المتصفح رؤوس طلب التحكم في الوصول، ويشارك البيانات التي جرى استرجاعها مع تطبيق العميل
بدلاً من ذلك، إذا كان الخادم لا يريد السماح بالوصول عبر الأصول، فإنه يستجيب برسالة خطأ.
مثال لمشاركة الموارد عبر الأصول
على سبيل المثال، بفرض وجود موقع يُسمى https://news.example.com. هذا الموقع يريد الوصول إلى الموارد من واجهة برمجة التطبيقات (API) على partner-api.com.
يكوِّن المطورون على https://partner-api.com رؤوس مشاركة الموارد عبر الأصول (CORS) على خادمهم عن طريق إضافة new.example.com إلى قائمة الأصول المسموح بها. يفعلون ذلك عن طريق إضافة السطر أدناه إلى ملف تكوين خادمهم.
Access-Control-Allow-Origin: https://news.example.com
بمجرد تكوين الوصول إلى مشاركة الموارد عبر المصادر (CORS)، يمكن أن يطلب news.example.com الموارد من partner-api.com. بالنسبة لكل طلب، سيستجيب partner-api.com على النحو التالي Access-Control-Allow-Credentials: ("true"). يعرف المتصفح بعد ذلك أن الاتصال مصرح به، ويسمح بالوصول عبر الأصول.
إذا كنت تريد منح حق الوصول إلى أصول متعددة، فاستخدم قائمة مفصولة بفاصلات أو أحرف البدل مثل *، التي تمنح حق الوصول للجميع.
ما طلب التحقق المسبق لمشاركة الموارد عبر الأصول؟
في بروتوكول نقل النص التشعبي (HTTP)، أساليب الطلب هي عمليات البيانات التي يريد العميل أن ينفذها الخادم. تتضمن أساليب بروتوكول نقل النص التشعبي (HTTP) الشائعة GET (الحصول) وPOST (نشر) وPUT (وضع) وDELETE (حذف).
في التفاعل المعتاد لمشاركة الموارد عبر الأصول (CORS)، يرسل المتصفح رؤوس الطلب والتحكم في الوصول في الوقت نفسه. عادةً ما تكون هذه طلبات البيانات GET وتُعد منخفضة المخاطر.
ومع ذلك، تعتبر بعض طلبات بروتوكول نقل النص التشعبي (HTTP) معقدة، وتتطلب تأكيد الخادم قبل إرسال الطلب الفعلي. تُسمى عملية الموافقة المسبقة طلب التحقق المسبق.
الطلبات المعقدة عبر الأصول
تكون الطلبات عبر الأصول معقدة إذا استخدمت أيًا مما يلي:
- أساليب أخرى غير GET أو POST أو HEAD
- رؤوس أخرى غير Accept-Language أو Accept أو Content-Language
- رؤوس نوع المحتوى بخلاف multipart/form-data أو application/x-www-form-urlencoded أو text/plain
لذلك، على سبيل المثال، تُعد طلبات حذف البيانات الموجودة أو تعديلها معقدة.
كيفية عمل طلبات التحقق المسبق
تنشئ المتصفحات طلبات التحقق المسبق إذا لزم الأمر. إنه طلب OPTIONS (خيارات) مثل الطلب الآتي.
OPTIONS /data HTTP/1.1 الأصل: https://example.com Access-Control-Request-Method: DELETE |
يرسل المتصفح طلب التحقق المسبق قبل رسالة الطلب الفعلي. يجب أن يستجيب الخادم لطلب التحقق المسبق بمعلومات حول طلبات الأصل المتعدد التي يرغب الخادم في قبولها من عنوان URL الخاص بالعميل. يجب أن تتضمن رؤوس استجابة الخادم ما يلي:
- Access-Control-Allow-Methods
- Access-Control-Allow-Headers
- Access-Control-Allow-Origin
فيما يلي مثال لاستجابة الخادم.
HTTP/1.1 200 OK Access-Control-Allow-Headers: Content-Type Access-Control-Allow-Origin: https://news.example.com Access-Control-Allow-Methods: GET, DELETE, HEAD, OPTIONS |
تتضمن استجابة التحقق المسبق أحيانًا رأس Access-Control-Max-Age إضافيًا. يحدد هذا المقياس المدة (بالثواني) التي يستغرقها المتصفح لتخزين نتائج التحقق المسبق مؤقتًا في المتصفح. يسمح التخزين المؤقت للمتصفح بإرسال العديد من الطلبات المعقدة فيما بين طلبات التحقق المسبق. لا يلزم إرسال طلب التحقق المسبق آخر حتى ينقضي الوقت المحدد من خلال max-age.
ما الفرق بين CORS وJSONP؟
JSON with Padding (JSONP) هي تقنية قديمة تسمح بالاتصال بين تطبيقات الويب التي تُدار على نطاقات مختلفة.
باستخدام تقنية JSONP، يمكنك استخدام إشارات البرامج النصية بلغة HTML في صفحة العميل. تُحمِّل إشارة البرنامج النصي ملفات JavScript الخارجية أو تُضمِّن التعليمات البرمجية لـ JavaScript في صفحة HTML. نظرًا إلى أن البرامج النصية لا تخضع لسياسة الأصل الأوحد، فإنه يمكنك استرداد البيانات عبر الأصول من خلال التعليمات البرمجية لـ JavaScript.
ومع ذلك، يجب أن تكون البيانات بتنسيق JSON. وتُعد تقنية JSONP أقل أمانًا من مشاركة الموارد عبر الأصول (CORS) نظرًا إلى أنها تعتمد على موثوقية النطاق الخارجي لتوفير بيانات آمنة.
أضافت المتصفحات الحديثة بعض ميزات الأمان، لذلك لن تعمل التعليمات البرمجية القديمة التي تحتوي على تقنية JSONP عليها. مشاركة الموارد عبر الأصول (CORS) هو معيار الويب العالمي الحالي للتحكم في الوصول عبر الأصول.
ما بعض أفضل ممارسات مشاركة الموارد عبر الأصول؟
يجب مراعاة ما يلي عند تكوين مشاركة الموارد عبر الأصول (CORS) على خادمك.
تحديد قوائم الوصول المناسبة
من الأفضل دائمًا منح إمكانية الوصول إلى النطاقات الفردية باستخدام قوائم مفصولة بفواصل. تجنب استخدام أحرف البدل إلا إذا كنت تريد جعل واجهة برمجة التطبيقات (API) عامة. وبخلاف ذلك، قد يؤدي استخدام أحرف البدل والتعبيرات العادية إلى وجود ثغرات أمنية.
على سبيل المثال، لنفترض أنك تكتب تعبيرًا عاديًا يمنح الوصول إلى جميع المواقع التي تحتوي على اللاحقة permitted-website.com. باستخدام تعبير واحد، تمنح إمكانية الوصول إلى api.permitted-website.com وnews.permitted-website.com. ولكنك أيضًا تمنح إمكانية الوصول عن غير قصد إلى مواقع غير مصرح بها يمكنها استخدام نطاقات، مثل maliciouspermitted-website.com.
تجنب استخدام الأصل الفارغ في قائمتك
ترسل بعض المتصفحات القيمة null (فارغ أو فارغة) في رأس الطلب لسيناريوهات معينة، مثل طلبات الملفات أو الطلبات من المضيف المحلي.
ومع ذلك، يجب عدم تضمين القيمة الفارغة في قائمة الوصول الخاصة بك. فهذا يتسبب أيضًا في مخاطر أمنية نظرًا إلى أن الطلبات غير المصرح بها التي تحتوي على رؤوس فارغة قد تتمكن من الوصول.
كيف يمكن أن تدعم AWS متطلبات مشاركة الموارد عبر الأصول الخاصة بك؟
الكثير من خدماتنا مزودة بدعم مُضمَّن لمشاركة الموارد عبر الأصول (CORS). لذلك، يمكنك التحكم في الوصول عبر الأصول إلى واجهات برمجة التطبيقات والموارد المستضافة على Amazon Web Services (AWS).
فيما يلي بعض خدمات AWS المزودة بدعم مشاركة الموارد عبر الأصول:
- خدمة التخزين البسيطة في Amazon (Amazon S3) هي خدمة تخزين كائنات توفر فئات تخزين فعَّالة من حيث التكلفة لجميع حالات استخدام تخزين البيانات. تتيح لك Amazon S3 إنشاء مستند تكوين مشاركة الموارد عبر الأصول (CORS) باستخدام قواعد تحدد الأصول التي ستسمح لها بالوصول إلى بيانات S3 لديك، والعمليات (أساليب HTTP) التي ستدعمها لكل أصل، والمعلومات الأخرى الخاصة بالعمليات. يمكنك إضافة ما يصل إلى 100 قاعدة إلى عملية التكوين.
- بوابة Amazon API عبارة عن خدمة مدارة بالكامل تتيح لك سهولة إنشاء واجهات برمجة تطبيقات ونشرها وصيانتها ومراقبتها وتأمينها على أي نطاق. يمكنك تمكين مشاركة الموارد عبر الأصول لواجهات برمجة تطبيقات REST الخاصة بك بنقرة واحدة مباشرةً في وحدة التحكم لبوابة Amazon API.
ابدأ باستخدام واجهات برمجة التطبيقات على AWS من خلال إنشاء حساب اليوم.