إضافة عناوين إضافية لطلب HTTP

بافول دروتار
بافول دروتار

تحتوي طلبات HTTP على عناوين، مثل "وكيل المستخدم" أو "نوع المحتوى". وبصرف النظر عن العناوين المرفقة من خلال المتصفّحات، قد تُدرِج تطبيقات Android عناوين إضافية، مثل ملف تعريف الارتباط أو المُحيل من خلال هدف EXTRA_HEADERS الإضافي. لأسباب أمنية، يُجري Chrome فلترة لبعض العناوين الإضافية بناءً على طريقة ومكان إطلاق النية.

تتطلّب الطلبات المتعدّدة المصادر طبقة أمان إضافية لأنّ العميل والخادم غير مملوكَين للطرف نفسه. يناقش هذا الدليل كيفية إطلاق هذه الطلبات من خلال علامات التبويب المخصَّصة في Chrome، أي الأهداف التي يتم إطلاقها من التطبيقات التي تفتح عنوان URL في علامة تبويب المتصفّح. وحتى الإصدار Chrome 83، كان بإمكان المطوّرين إضافة أي عناوين عند إطلاق علامة تبويب مخصّصة. بدءًا من الإصدار 83 فصاعدًا، بدأ Chrome في فلترة كل العناوين باستثناء العناوين المُعتمدة من مصادر متعددة، لأنّ العناوين غير الموافَق عليها تُشكّل خطرًا أمنيًا. بدءًا من الإصدار 86 من Chrome، يمكن إرفاق العناوين غير المعتمَدة بالطلبات من مصادر متعددة، عندما يكون الخادم والعميل مرتبطَين باستخدام رابط مادة العرض الرقمية. ويتم تلخيص هذا السلوك في الجدول التالي:

إصدار Chrome عناوين CORS المسموح بها
قبل Chrome 83 تمت الموافقة عليه، غير موافق عليه
الإصدارات من 83 إلى Chrome 85 من Chrome تمت الإضافة إلى قائمة الموافقة
بدءًا من الإصدار 86 من Chrome والإصدارات الأحدث تمت الموافقة عليها، وغير موافَق عليها عند إعداد رابط مادة عرض رقمية

الجدول 1: فلترة عناوين CORS غير الموافَق عليها

توضح هذه المقالة كيفية إعداد اتصال متحقق منه بين الخادم والعميل واستخدام ذلك لإرسال عناوين http التي تمت الموافقة عليها وأخرى غير موافَق عليها. يمكنك التخطّي إلى إضافة عناوين إضافية إلى الأهداف المخصّصة لعلامات التبويب للرمز.

الخلفية

عناوين طلبات الموافقة والشفافية في مقابل قائمة المستخدمين غير الموافَق عليها

تسمح مشاركة الموارد المتعدّدة المصادر (CORS) لتطبيق الويب من مصدر واحد بطلب موارد من مصدر مختلف. يتم الاحتفاظ بقائمة العناوين المعتمدة من سياسة CORS في معيار HTML. يتم عرض أمثلة للعناوين المدرَجة في القائمة التي تمت الموافقة عليها في الجدول التالي:

Header الوصف
لغة القبول الإعلان عن اللغات الطبيعية التي يفهمها العميل
لغة المحتوى يصف اللغة المقصودة للجمهور الحالي
نوع المحتوى يشير إلى نوع وسائط المورد

الجدول 2: أمثلة على عناوين CORS المُدرجة في القائمة التي تمت الموافقة عليها

تُعد العناوين التي تمت الموافقة عليها آمنة لأنها لا تحتوي على معلومات حساسة للمستخدم، ومن غير المحتمل أن تتسبب في تنفيذ الخادم لعمليات قد تؤدي إلى حدوث ضرر.

في ما يلي أمثلة على العناوين غير المعتمَدة في الجدول التالي:

Header الوصف
حامل رمز مميز مصادقة العميل على الخادم
origin يشير إلى مصدر الطلب
كعكة محلاة يحتوي على ملفات تعريف ارتباط يضبطها الخادم

الجدول 3: أمثلة على عناوين CORS غير الموافَق عليها

لا ينصح معيار HTML بإرفاق عناوين غير موافَق عليها بطلبات CORS، وتفترض الخوادم أنّ الطلبات من مصادر متعددة لا تحتوي إلا على العناوين المُدرجة في القائمة التي تمت الموافقة عليها. سيؤدي إرسال العناوين غير الموافَق عليها من نطاقات متعددة المصادر إلى السماح للتطبيقات الضارّة التابعة لجهات خارجية بصياغة عناوين تسيء استخدام ملفات تعريف ارتباط المستخدم التي يخزنها Chrome (أو أي متصفّح آخر) ويرفِقها بالطلبات. تمكن ملفات تعريف الارتباط من مصادقة معاملات الخادم الضارة التي لم تكن ممكنة بخلاف ذلك.

إرفاق رؤوس CORS المُدرجة في القائمة التي تمت الموافقة عليها بطلبات علامات التبويب المخصصة

علامات التبويب المخصصة هي طريقة خاصة لتشغيل صفحات الويب في علامة تبويب متصفّح مخصصة. يمكن إنشاء الغرض من علامة التبويب المخصّصة باستخدام CustomTabsIntent.Builder(). يمكنك أيضًا إرفاق عناوين بهذه الأغراض باستخدام علامة Bundle مع علامة Browser.EXTRA_HEADERS:

CustomTabsIntent intent = new CustomTabsIntent.Builder(session).build();

Bundle headers = new Bundle();
headers.putString("bearer-token", "Some token");
headers.putString("redirect-url", "Some redirect url");   
intent.intent.putExtra(Browser.EXTRA_HEADERS, headers);

intent.launchUrl(Activity.this, Uri.parse("http://www.google.com"));

يمكننا دائمًا إرفاق العناوين المُدرَجة في القائمة التي تمت الموافقة عليها بطلبات CORS لعلامات التبويب المخصَّصة. ومع ذلك، يعمل Chrome على فلترة الرؤوس غير المعتمَدة تلقائيًا. وعلى الرغم من أن المتصفحات الأخرى قد يكون لها سلوك مختلف، من المفترض أن يتوقع مطوّرو البرامج حظر العناوين غير المعتمدة بشكل عام.

إنّ الطريقة المتاحة لتضمين العناوين غير المعتمَدة في علامات التبويب المخصَّصة هي أولاً التحقّق من الاتصال من مصادر متعددة باستخدام رابط وصول رقمي. يوضِّح القسم التالي كيفية إعداد هذه الواجهات وإطلاق الغرض من علامات التبويب المخصّصة باستخدام العناوين المطلوبة.

إضافة عناوين إضافية إلى الأغراض المخصّصة لعلامات التبويب

للسماح بمرور العناوين غير الموافَق عليها من خلال الأغراض المخصّصة لعلامة التبويب، من الضروري إعداد رابط إلى مواد العرض الرقمية بين تطبيق Android وتطبيق الويب يؤكّد أنّ المؤلف يملك كلا التطبيقَين.

اتّبِع الدليل الرسمي لإعداد رابط إلى مواد العرض الرقمية. بالنسبة إلى علاقة الرابط، استخدِم "delegate_permission/common.use_as_origin"` الذي يشير إلى أن التطبيقَين ينتميان إلى نفس المصدر بعد التحقّق من الرابط.

إنشاء هدف مخصّص لعلامة التبويب مع عناوين إضافية

تتوفّر عدة طرق لإنشاء هدف مخصّص في علامات التبويب. يمكنك استخدام أداة الإنشاء المتوفرة في androidX من خلال إضافة المكتبة إلى تبعيات الإصدار:

MULTI_LINE_CODE_PLACEHOLDER_1

بناء النية وإضافة عناوين إضافية:

MULTI_LINE_CODE_PLACEHOLDER_2

يتم استخدام اتصال "علامات التبويب المخصَّصة" لضبط CustomTabsSession بين التطبيق وعلامة التبويب في Chrome. نحتاج إلى الجلسة للتحقّق من أنّ التطبيق وتطبيق الويب ينتميان إلى المصدر نفسه. لا تجتاز عملية إثبات الهوية إلّا إذا تم إعداد روابط مواد العرض الرقمية بشكلٍ صحيح.

نشجعك على الاتصال بـ CustomTabsClient.warmup(). وهو يسمح لتطبيق المتصفح بالتهيئة المسبقة في الخلفية وتسريع عملية فتح عنوان URL.

MULTI_LINE_CODE_PLACEHOLDER_3

إعداد معاودة الاتصال لتشغيل Intent بعد التحقّق

تم تمرير CustomTabsCallback إلى الجلسة. وقد أعددت onRelationshipValidationResult() لإطلاق عنصر CustomTabsIntent الذي تم إنشاؤه سابقًا بعد نجاح عملية التحقق من المصدر.

MULTI_LINE_CODE_PLACEHOLDER_4

ربط اتصال خدمة علامات التبويب المخصَّصة

يؤدي ربط الخدمة إلى تشغيل الخدمة وسيتم استدعاء onCustomTabsServiceConnected() للاتصال في النهاية. لا تنسَ إلغاء ربط الخدمة بشكل مناسب. عادةً ما يتم إجراء الربط وإلغاء الربط في طرق دورة حياة النشاط onStart() وonStop().

// Bind the custom tabs service connection.
// Call this in onStart()
CustomTabsClient.bindCustomTabsService(this,
    CustomTabsClient.getPackageName(MainActivity.this, null), connection);

// …
// Unbind the custom tabs service.
// Call this in onStop().
unbindService(connection);

رمز التطبيق التجريبي

يمكنك العثور على مزيد من التفاصيل عن "خدمة علامات التبويب المخصَّصة" هنا. يمكنك الاطّلاع على مستودع GitHub android-Browser-helper للحصول على نموذج تطبيق فعال.

ملخّص

أوضح هذا الدليل كيفية إضافة عناوين عشوائية إلى طلبات CORS المخصصة لعلامات التبويب. يمكن إرفاق العناوين المعتمدة بكل طلب CORS لعلامات التبويب المخصصة. وتُعدّ العناوين غير المعتمَدة بشكل عام غير آمنة في طلبات CORS وتعمل على فلترة هذه العناوين تلقائيًا من خلال Chrome. ويُسمح بإرفاقها فقط للعملاء والخوادم من نفس المصدر، والتي تم التحقق منها من خلال رابط مواد العرض الرقمية.