التحكّم في ميزات المتصفّح من خلال "سياسة الأذونات"

يمكنك إدارة طريقة وصول صفحتك وإطارات iframe التابعة لجهات خارجية على صفحتك إلى ميزات المتصفّح.

Kevin K. Lee
Kevin K. Lee

تتيح سياسة الأذونات، المعروفة سابقًا باسم "سياسة الميزات"، للمطوّرين التحكم في ميزات المتصفح المتاحة لإحدى الصفحات وإطارات iframe الخاصة بها من خلال الإعلان عن مجموعة من السياسات التي يجب أن يفرضها المتصفّح. هذه يتم تطبيق هذه السياسات على المصادر المقدّمة في قائمة مصادر عناوين الاستجابة. يمكن أن تحتوي قائمة المصادر على المصادر نفسها و/أو مصادر متعددة، كما تسمح بذلك. للمطوّرين التحكّم في إمكانية وصول الطرف الأول والطرف الثالث إلى ميزات المتصفّح.

لدى المستخدم القرار النهائي بالسماح بالوصول إلى ميزات أكثر فعالية، وعليه تقديم إذن صريح عبر طلب.

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

التغييرات على سياسة الأذونات

كانت سياسة الأذونات تُعرف سابقًا باسم "سياسة الميزات". تظل المفاهيم الرئيسية كما هي، لكن هناك بعض التغييرات المهمة إلى جانب الاسم.

استخدام الحقول المنظَّمة

توفّر الحقول المنظَّمة مجموعة من بُنى البيانات الشائعة لتوحيد تحليل وتسلسل قيم حقول عنوان HTTP. يمكنك الاطّلاع على مزيد من المعلومات عن "الحقول المنظَّمة" من مشاركة المدونة "تحسين HTTP باستخدام حقول العناوين المنظَّمة" على مدونة Fastly.

الإصدار القديم
  geolocation 'self' https://example.com; camera 'none'

قبل سياسة الميزات.

جديد
  geolocation=(self "https://example.com"), camera=()

الآن مع سياسة الأذونات.

دمج العناوين مع سمة iframe allow

باستخدام سياسة الميزات، يمكنك إضافة الميزة إلى إطار من مصادر متعددة إما عن طريق إضافة المصدر إلى قائمة مصادر العنوان أو إضافة سمة allow إلى علامة iframe. وفقًا لسياسة الأذونات، إذا أضفت إطارًا من مصادر متعددة إلى قائمة المصادر، يجب أن تتضمّن علامة iframe لهذا المصدر السمة allow. إذا لم تتضمّن الاستجابة عنوانًا لسياسة الأذونات، تُعتبر قائمة المصادر تحتوي على القيمة التلقائية *. وتتيح إضافة السمة allow إلى إطار iframe إمكانية الوصول إلى الميزة.

وبالتالي، ننصح المطوّرين بضبط عنوان "سياسة الأذونات" صراحةً في الاستجابة، ليتم حظر وصول إطارات iframe من مصادر متعددة غير المُدرَجة في قائمة المصادر إلى هذه الميزة، حتى في حال توفُّر allow.

لا يزال من الممكن استخدام سياسة الميزات بعد الإصدار 88 من Chrome، ولكنها تعمل كاسم مستعار لسياسة الأذونات. بخلاف الصيغة، لا يوجد اختلاف في المنطق. في حال استخدام كل من عنوانَي "سياسة الأذونات" و"سياسة الميزات" معًا، سيكون لعنوان Permissions-Policy أولوية أعلى، وسيتم استبدال القيمة المقدّمة في العنوان Feature-Policy.

كيف يمكنني استخدام "سياسة الأذونات"؟

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

قبل التعمّق في التفاصيل، دعونا نلقي نظرة سريعة على سيناريو شائع وأنت مالك موقع إلكتروني وتريد التحكّم في كيفية استخدام موقعك الإلكتروني ورمز الجهة الخارجية لميزات المتصفّح.

  • موقعك الإلكتروني هو https://your-site.example.
  • يضمِّن موقعك الإلكتروني إطار iframe من المصدر نفسه (https://your-site.example).
  • يضمِّن موقعك الإلكتروني إطار iframe من https://trusted-site.example تثق به.
  • يعرض موقعك الإلكتروني أيضًا إعلانات تعرضها "https://ad.example".
  • إذا كنت تريد السماح بتحديد الموقع الجغرافي لموقعك الإلكتروني والموقع الموثوق به فقط، وليس للإعلان.

وفي هذه الحالة، استخدِم رأس الصفحة التالي:

Permissions-Policy: geolocation=(self "https://trusted-site.example")

اضبط السمة allow بشكل صريح على علامة iframe للموقع الموثوق به:

<iframe src="https://trusted-site.example" allow="geolocation">

مخطّط نظرة عامة سريعة حول استخدام &quot;سياسة الأذونات&quot;

في هذا المثال، تتيح قائمة أصول العنوان فقط لموقعك الإلكتروني (self) وtrusted-site.example استخدام ميزة الموقع الجغرافي. لا يُسمح لتطبيق ad.example باستخدام ميزة رصد الموقع الجغرافي.

  1. يُسمح لموقعك الإلكتروني your-site.example باستخدام ميزة رصد الموقع الجغرافي بموافقة المستخدم.
  2. يُسمَح لإطار iframe نفسه المصدر (your-site.example) باستخدام الميزة بدون استخدام السمة allow.
  3. إنّ إطار iframe المعروض من نطاق فرعي مختلف (subdomain.your-site-example) لم تتم إضافته إلى قائمة المصادر ويحتوي على سمة "السماح" التي تم ضبطها على علامة iframe، يُحظر استخدام هذه الميزة. وتُعتبر النطاقات الفرعية المختلفة موقعًا إلكترونيًا واحدًا ولكن من مصدر آخر.
  4. إنّ إطار iframe من مصادر متعددة (trusted-site.example) تمت إضافته إلى قائمة المصادر وتم ضبطه على السمة allow على علامة iframe ويُسمح باستخدام هذه الميزة.
  5. يتم حظر إطار iframe من مصادر متعددة (trusted-site.example) تمت إضافته إلى قائمة المصادر بدون السمة allow، من استخدام الميزة.
  6. إنّ إطار iframe من مصادر متعددة (ad.example) لم تتم إضافته إلى قائمة المصادر يُحظر استخدامه، حتى في حال تضمين سمة allow في علامة iframe.

عنوان استجابة HTTP Permissions-Policy

يقدّم المستخدم طلبًا، ويستجيب الخادم بعرض العنوان &quot;سياسة الأذونات&quot;، ثم يمنح المتصفّح إمكانية الوصول استنادًا إلى ذلك العنوان.

Permissions-Policy: &lt;feature&gt;=(&lt;token&gt;|&lt;origin(s)&gt;)

يمكنك استخدام عنوان Permissions-Policy في الاستجابة من الخادم لضبط المصادر المسموح بها لإحدى الميزات. يمكن أن تأخذ قيمة العنوان مجموعة من الرموز المميّزة وسلاسل المصادر. الرموز المميّزة المتوفّرة هي * لكل المصادر وself للمصدر نفسه.

إذا كان الرأس يتعلق بميزات متعددة، فافصل بين الميزات بفاصلة. في حال إدراج عدّة مصادر، عليك الفصل بين كل مصدر في قائمة المصادر بمسافة. بالنسبة إلى العناوين التي تسرد مصدرًا هو طلب من مصادر متعددة، يجب أن تتضمّن علامة iframe السمة allow.

في ما يلي بعض الأمثلة على أزواج المفتاح/القيمة:

  • البنية: [FEATURE]=*
    • السياسة المطبّقة على جميع المصادر
    • مثلاً: geolocation=*
  • البنية: [FEATURE]=(self)
    • السياسة المطبّقة على المصدر نفسه
    • مثلاً: geolocation=(self)
  • البنية: [FEATURE]=(self [ORIGIN(s)])
    • السياسة التي يتم تطبيقها على المصدر نفسه والمصادر المحدّدة
    • مثلاً: geolocation=(self "https://a.example" "https://b.example")
    • self هو اختصار للمصطلح https://your-site.example
  • البنية: [FEATURE]=([ORIGIN(s)])
    • السياسة التي يتم تطبيقها على المصدر نفسه والمصادر المحدّدة
    • مثلاً: geolocation=("https://your-site.example" "https://a.example" "https://b.example")
    • عند استخدام هذه البنية، يجب أن يكون أحد المصادر هو أصل أداة التضمين. إذا لم تحصل صفحة التضمين نفسها على الأذونات، سيتم أيضًا حظر إطارات iframe المضمَّنة في تلك الصفحة على الرغم من إضافتها إلى قائمة المصادر، وذلك لأنّ سياسة الأذونات تفوّض الأذونات. يمكنك أيضًا استخدام الرمز المميّز self.
  • البنية: [FEATURE]=()
    • تم حظر الميزة في جميع المصادر.
    • مثلاً: geolocation=()

النطاقات الفرعية والمسارات المختلفة

تُعتبر النطاقات الفرعية المختلفة، مثل https://your-site.example وhttps://subdomain.your-site.example، موقعًا إلكترونيًا واحدًا ولكن من مصادر متعددة. وبالتالي، لن تسمح إضافة نطاق فرعي في قائمة المصادر بالوصول إلى نطاق فرعي آخر على الموقع الإلكتروني نفسه. يجب إضافة كل نطاق فرعي مضمّن يريد استخدام الميزة بشكل منفصل إلى قائمة المصادر. على سبيل المثال، إذا كان يُسمح بالوصول إلى مواضيع التصفّح الخاصة بالمستخدم من المصدر نفسه فقط باستخدام العنوان Permissions-Policy: browsing-topics=(self)، لن يتمكّن إطار iframe من نطاق فرعي مختلف للموقع الإلكتروني نفسه، https://subdomain.your-site.example، من الوصول إلى المواضيع.

تُعتبر المسارات المختلفة، مثل https://your-site.example وhttps://your-site.example/embed، مصدرًا واحدًا، ولا يجب إدراج المسارات المختلفة في قائمة المصادر.

سمة allow في إطار iframe

إعداد إطارات iframe

للاستخدام من مصادر متعددة، يحتاج إطار iframe إلى السمة allow في العلامة ليتمكّن من الوصول إلى الميزة.

البنية: <iframe src="[ORIGIN]" allow="[FEATURE] <'src' | [ORIGIN(s)]"></iframe>

على سبيل المثال:

<iframe src="https://trusted-site.example" allow="geolocation">

التعامل مع التنقّل في إطار iframe

إعداد التنقّل في إطارات iframe

إذا انتقل إطار iframe إلى مصدر آخر تلقائيًا، لا يتم تطبيق السياسة على المصدر الذي ينتقل إليه إطار iframe. من خلال إدراج المصدر الذي ينتقل إليه إطار iframe في السمة allow، سيتم تطبيق سياسة الأذونات التي تم تطبيقها على إطار iframe الأصلي على المصدر الذي ينتقل إليه إطار iframe.

<iframe src="https://trusted-site.example" allow="geolocation https://trusted-site.example https://trusted-navigated-site.example">

يمكنك الاطّلاع عليها أثناء التنفيذ من خلال الانتقال إلى العرض التوضيحي للتنقّل في iframe.

أمثلة على عمليات إعداد سياسة الأذونات

يمكن العثور على أمثلة على عمليات الإعداد التالية في العرض التوضيحي.

هذه الميزة مسموح بها في جميع المصادر.

بنية جميع الأصول المسموح لها بالوصول إلى الميزة

Permissions-Policy: geolocation=*
<iframe src="https://trusted-site.example" allow="geolocation">
<iframe src="https://ad.example" allow="geolocation">

عند ضبط قائمة المصادر على الرمز المميّز *، يتم السماح باستخدام هذه الميزة في جميع المصادر المتوفّرة على الصفحة، بما في ذلك الصفحة نفسها وجميع إطارات iframe. في هذا المثال، يمكن لكل الرموز التي يتم عرضها من خلال https://your-site.example والرموز التي يتم عرضها من خلال https://trusted-site.example iframe وhttps://ad.example الوصول إلى ميزة رصد الموقع الجغرافي في متصفّح المستخدم. تذكَّر أنّه يجب أيضًا ضبط سمة "allow" على إطار iframe نفسه مع إضافة المصدر إلى قائمة مصادر العنوان.

يمكنك الاطّلاع على هذا الإعداد في العرض التوضيحي.

يُسمح بالميزة من المصدر نفسه فقط.

بنية من المصدر نفسه فقط لا يُسمح لها بالوصول إلى الميزة

Permissions-Policy: geolocation=(self)

ويؤدي استخدام الرمز المميز self إلى السماح باستخدام رصد الموقع الجغرافي للمصدر نفسه فقط. لن تتمكن الجهات الخارجية من الوصول إلى الميزة. في هذا المثال، سيتم منح إذن الوصول إلى بيانات الموقع الجغرافي لـ "https://trusted-site.example" (self) فقط. يمكنك استخدام هذه البنية إذا كنت تريد إضافة الميزة إلى صفحتك فقط وليس لشخص آخر.

يمكنك الاطّلاع على هذا الإعداد في العرض التوضيحي.

تتوفّر الميزة على المصدر نفسه ومصادر محدّدة من مصادر متعددة.

بنية مصادر محدّدة مسموح لها بالوصول إلى الميزة

Permissions-Policy: geolocation=(self "https://trusted-site.example")

تتيح هذه البنية استخدام ميزة رصد الموقع الجغرافي على كلّ من الذات (https://your-site.example) وhttps://trusted-site.example. تذكر أن تضيف سمة "السماح" بشكل صريح إلى علامة iframe. إذا كان هناك إطار iframe آخر مع <iframe src="https://ad.example" allow="geolocation">، لن يتمكّن https://ad.example من الوصول إلى ميزة رصد الموقع الجغرافي. يمكن فقط للصفحة الأصلية وhttps://trusted-site.example المُدرَجين في قائمة المصادر مع تضمين سمة "السماح" في علامة iframe الوصول إلى ميزة المستخدم.

يمكنك الاطّلاع على هذا الإعداد في العرض التوضيحي.

تم حظر الميزة في جميع المصادر.

بنية جميع المصادر المحظورة من الوصول إلى العنصر

Permissions-Policy: geolocation=()

إذا كانت قائمة المصادر فارغة، سيتم حظر هذه الميزة لجميع المصادر. يمكنك الاطّلاع على هذا الإعداد في العرض التوضيحي.

استخدام JavaScript API

يمكن العثور على واجهة برمجة تطبيقات JavaScript الحالية الخاصة بسياسة الميزات كعنصر في المستند أو العنصر (document.featurePolicy or element.featurePolicy). لم يتم تنفيذ JavaScript API لسياسة الأذونات بعد.

يمكن استخدام واجهة برمجة التطبيقات Feature Policy API للسياسات التي تم ضبطها بواسطة سياسة الأذونات، مع تطبيق بعض القيود. هناك أسئلة متبقية بخصوص تنفيذ واجهة برمجة تطبيقات JavaScript، وتم تقديم اقتراح لنقل المنطق إلى Permissions API. انضم إلى المناقشة إذا كانت لديك أي أفكار.

featurePolicy.allowsFeature(feature)

  • تعرض true في حال السماح باستخدام الميزة لاستخدام المصدر التلقائي.
  • ينطبق السلوك نفسه لكل من السياستين اللتين تم ضبطهما من خلال سياسة الأذونات وسياسة الميزات السابقة.
  • عند استدعاء allowsFeature() على عنصر iframe (iframeEl.featurePolicy.allowsFeature('geolocation'))، تعكس القيمة المعروضة ما إذا تم ضبط سمة Allow على إطار iframe.

featurePolicy.allowsFeature(feature, source)

  • تعرض true إذا كانت الميزة مسموحًا بها للمصدر المحدّد.
  • إذا تم استدعاء هذه الطريقة في document، لن توضّح هذه الطريقة ما إذا كانت الميزة مسموحًا بها للمصدر المحدَّد كما فعلت سياسة الميزات. أمّا الآن، فتشير هذه الطريقة إلى أنّه من الممكن السماح باستخدام الميزة في هذا المصدر. عليك إجراء تحقّق إضافي لمعرفة ما إذا كان إطار iframe يتضمّن مجموعة السمة allow أم لا. يجب أن يُجري مطوّر البرامج فحصًا إضافيًا للسمة allow على عنصر iframe لتحديد ما إذا كان يُسمح بهذه الميزة للمصدر التابع لجهة خارجية.

التحقّق من الميزات في إطار iframe باستخدام الكائن element

يمكنك استخدام السمة element.allowsFeature(feature) التي تأخذ السمة المتاحة في الاعتبار على عكس السمة document.allowsFeature(feature, origin) التي لا تأخذها في الاعتبار.

const someIframeEl = document.getElementById('some-iframe')
const isCameraFeatureAllowed = someIframeEl.featurePolicy.allowsFeature('camera')

featurePolicy.allowedFeatures()

  • تعرض قائمة الميزات المسموح بها لاستخدام المصدر التلقائي.
  • يتم تطبيق السلوك نفسه على السياستَين اللتَين تم ضبطهما من خلال سياسة الأذونات وسياسة الميزات.
  • عندما تكون العقدة المرتبطة ضمن إطار iframe، تتم مراعاة سمة "السماح".

featurePolicy.features()

  • عرض قائمة الميزات المتاحة في المتصفح.
  • يتم تطبيق السلوك نفسه على السياستَين اللتَين تم ضبطهما من خلال سياسة الأذونات وسياسة الميزات.

دمج "أدوات مطوري البرامج في Chrome"

دمج &quot;أدوات مطوري البرامج في Chrome&quot; مع سياسة الأذونات

يمكنك الاطّلاع على طريقة عمل سياسة الأذونات في "أدوات مطوّري البرامج".

  1. افتح "أدوات مطوري البرامج في Chrome".
  2. افتح لوحة التطبيق للتحقّق من الميزات المسموح بها والميزات غير المسموح بها في كل إطار.
  3. في الشريط الجانبي، اختَر الإطار الذي تريد فحصه. ستظهر لك قائمة بالميزات المسموح للإطار المحدّد باستخدامها وقائمة بالميزات المحظورة في هذا الإطار.

نقل البيانات من سياسة الميزات

إذا كنت تستخدم حاليًا عنوان Feature-Policy، يمكنك تنفيذ الخطوات التالية لنقل البيانات إلى "سياسة الأذونات".

استبدال عناوين سياسة الميزات بعناوين سياسة الأذونات

بما أنّ عناوين "سياسة الميزات" لا تتوفّر إلا في المتصفِّحات المستنِدة إلى Chromium، وعناوين "سياسة الأذونات" متاحة منذ الإصدار 88 من Chrome، من الآمن تعديل العناوين الحالية باستخدام "سياسة الأذونات".

الإصدار القديم
Feature-Policy:
  autoplay *;
  geolocation 'self';
  camera 'self' 'https://trusted-site.example';
  fullscreen 'none';

قبل سياسة الميزات.

جديد
Permissions-Policy:
  autoplay=*,
  geolocation=(self),
  camera=(self "https://trusted-site.example"),
  fullscreen=()

الآن مع سياسة الأذونات.

تعديل استخدام document.allowsFeature(feature, origin)

إذا كنت تستخدم طريقة document.allowsFeature(feature, origin) للتحقّق من الميزات المسموح بها لإطارات iframe، يمكنك استخدام طريقة allowsFeature(feature) المرفقة في عنصر iframe، وليس في document الذي يتضمّن العنصر. تستخدم الطريقة element.allowsFeature(feature) السمة "Allow" في الاعتبار، على عكس document.allowsFeature(feature, origin).

جارٍ التأكّد من إمكانية استخدام الميزات من خلال "document"

لمواصلة استخدام document كعقدة أساسية، عليك إجراء عملية تحقّق إضافية للسمة allow على علامة iframe.

<iframe id="some-iframe" src="https://example.com" allow="camera"></iframe>
Permissions-Policy: camera=(self "https://example.com")
const isCameraPolicySet = document.featurePolicy.allowsFeature('camera', 'https://example.com')

const someIframeEl = document.getElementById('some-iframe')
const hasCameraAttributeValue = someIframeEl.hasAttribute('allow')
&& someIframeEl.getAttribute('allow').includes('camera')

const isCameraFeatureAllowed = isCameraPolicySet && hasCameraAttributeValue

بدلاً من تعديل الرمز الحالي باستخدام document، ننصح بطلب allowsFeature() في الكائن element مثل المثال السابق.

Reporting API

توفّر Reporting API آلية للإبلاغ عن تطبيقات الويب بطريقة متّسقة، وتتوفّر واجهة Reporting API المتعلّقة بانتهاكات سياسة الأذونات كميزة تجريبية.

إذا كنت تريد اختبار الميزة التجريبية، يُرجى اتّباع جولة تفصيلية وتفعيل العلامة في "chrome://flags/#enable-experimental-web-platform-features". من خلال تفعيل العلامة، يمكنك ملاحظة انتهاكات "سياسة الأذونات" في "أدوات مطوري البرامج" ضمن علامة التبويب "التطبيق":

يوضّح المثال التالي كيفية إنشاء عنوان Reporting API:

Reporting-Endpoints: main-endpoint="https://reports.example/main", default="https://reports.example/default"

Content-Security-Policy: script-src 'self'; object-src 'none'; report-to main-endpoint;
Document-Policy: document-write=?0; report-to=main-endpoint;

في عملية التنفيذ الحالية، يمكنك تلقّي تقارير انتهاك السياسات من أي انتهاكات تحدث ضمن ذلك الإطار من خلال ضبط نقطة نهاية باسم "تلقائي". مثل المثال أعلاه. ستتطلب الإطارات الفرعية ضبط إعداداتها الخاصة لإعداد التقارير.

التعرف على المزيد

للحصول على فهم أعمق لسياسة الأذونات، يمكنك الاطّلاع على المراجع التالية: