مراقبة تطبيق الويب باستخدام Reporting API

استخدِم Reporting API لمراقبة الانتهاكات الأمنية وطلبات البيانات من واجهة برمجة التطبيقات المتوقّفة وغير ذلك.

Maud Nalpas
Maud Nalpas

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

تتيح لك هذه السياسة تحديد ما تريد مراقبته باستخدام عناوين HTTP، وتتم إدارتها من خلال المتصفّح.

يمنحك إعداد Reporting API راحة البال لأنّك ستعرف متى يواجه المستخدمون هذه الأنواع من الأخطاء، ما يتيح لك إصلاحها.

تتناول هذه المشاركة ما يمكن أن تفعله واجهة برمجة التطبيقات هذه وكيفية استخدامها. لنبدأ.

نظرة عامة

مخطّط بياني يلخّص الخطوات أدناه، بدءًا من إنشاء التقرير إلى وصول المطوّر إليه
كيفية إنشاء التقارير وإرسالها

لنفترض أنّ موقعك الإلكتروني، site.example، يتضمّن سياسة Content-Security-Policy وسياسة Document-Policy. ألست على دراية بوظيفة هذه الإعدادات؟ لا بأس، سيظل بإمكانك فهم هذا المثال.

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

لإجراء ذلك، عليك ضبط عنوان Reporting-Endpoints، وربط أسماء نقاط النهاية هذه باستخدام توجيه report-to في سياساتك عند الحاجة.

Reporting-Endpoints: main-endpoint="https://reports.example/main", default="https://reports.example/default"
# Content-Security-Policy violations and Document-Policy violations
# will be sent to main-endpoint
Content-Security-Policy: script-src 'self'; object-src 'none'; report-to main-endpoint;
Document-Policy: document-write=?0; report-to=main-endpoint;
# Deprecation reports don't need an explicit endpoint because
# these reports are always sent to the `default` endpoint

يحدث خطأ غير متوقّع، ويتم انتهاك هذه السياسات بالنسبة إلى بعض المستخدمين.

أمثلة على المخالفات

index.html

<script src="script.js"></script>
<!-- CSP VIOLATION: Try to load a script that's forbidden as per the Content-Security-Policy -->
<script src="https://example.com/script.js"></script>

script.js، تم تحميله من قِبل index.html

// DOCUMENT-POLICY VIOLATION: Attempt to use document.write despite the document policy
try {
  document.write('<h1>hi</h1>');
} catch (e) {
  console.log(e);
}
// DEPRECATION: Call a deprecated API
const webkitStorageInfo = window.webkitStorageInfo;

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

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

تتلقّى نقاط النهاية هذه التقارير.

يمكنك الآن الوصول إلى التقارير حول نقاط النهاية هذه وتتبُّع المشاكل التي حدثت. أنت الآن جاهز لبدء تحديد المشكلة التي تؤثر في المستخدمين وحلّها.

مثال على التقرير

{
  "age": 2,
  "body": {
    "blockedURL": "https://site2.example/script.js",
    "disposition": "enforce",
    "documentURL": "https://site.example",
    "effectiveDirective": "script-src-elem",
    "originalPolicy": "script-src 'self'; object-src 'none'; report-to main-endpoint;",
    "referrer": "https://site.example",
    "sample": "",
    "statusCode": 200
  },
  "type": "csp-violation",
  "url": "https://site.example",
  "user_agent": "Mozilla/5.0... Chrome/92.0.4504.0"
}

حالات الاستخدام وأنواع التقارير

يمكن ضبط Reporting API لمساعدتك في مراقبة العديد من أنواع التحذيرات أو المشاكل المهمة التي تحدث في جميع أنحاء موقعك الإلكتروني:

نوع التقرير مثال على حالة يتم فيها إنشاء تقرير
مخالفة سياسة أمان المحتوى (CSP) (المستوى 3 فقط) لقد ضبطت Content-Security-Policy (CSP) على إحدى صفحاتك، ولكنّ الصفحة تحاول تحميل نص برمجي لا تسمح به سياسة CSP.
انتهاك سياسة COOP لقد ضبطتَ Cross-Origin-Opener-Policy على صفحة، ولكن تحاول نافذة من مصادر متعددة التفاعل مباشرةً مع المستند.
انتهاك سياسة COEP لقد ضبطت Cross-Origin-Embedder-Policy على إحدى الصفحات، ولكن يتضمّن المستند إطار iframe متعدد المصادر لم يتم ضبطه ليتم تحميله من خلال مستندات متعددة المصادر.
انتهاك سياسة المستندات تحتوي الصفحة على سياسة مستند تمنع استخدام document.write، ولكن يحاول نص برمجي استدعاء document.write.
انتهاك سياسة الأذونات تحتوي الصفحة على سياسة أذونات تمنع استخدام الميكروفون، وعلى نص برمجي يطلب إدخال الصوت.
تحذير بشأن الإيقاف النهائي تستخدم الصفحة واجهة برمجة تطبيقات متوقّفة نهائيًا أو سيتم إيقافها نهائيًا، وتطلبها مباشرةً أو باستخدام نص برمجي تابع لجهة خارجية من المستوى الأعلى.
التدخّل تحاول الصفحة تنفيذ إجراء يرفض المتصفّح تنفيذه لأسباب تتعلّق بالأمان أو الأداء أو تجربة المستخدم. مثال في Chrome: تستخدم الصفحة document.write على الشبكات البطيئة أو تستدعي navigator.vibrate في إطار من مصادر متعددة لم يتفاعل معه المستخدم بعد.
حادث سير يتعطّل المتصفّح أثناء فتح موقعك الإلكتروني.

التقارير

كيف تبدو التقارير؟

يرسل المتصفّح التقارير إلى نقطة النهاية التي ضبطتها. ويرسل طلبات تظهر على النحو التالي:

POST
Content-Type: application/reports+json

حمولة هذه الطلبات هي قائمة بالتقارير.

مثال على قائمة التقارير

[
  {
    "age": 420,
    "body": {
      "columnNumber": 12,
      "disposition": "enforce",
      "lineNumber": 11,
      "message": "Document policy violation: document-write is not allowed in this document.",
      "policyId": "document-write",
      "sourceFile": "https://site.example/script.js"
    },
    "type": "document-policy-violation",
    "url": "https://site.example/",
    "user_agent": "Mozilla/5.0... Chrome/92.0.4504.0"
  },
  {
    "age": 510,
    "body": {
      "blockedURL": "https://site.example/img.jpg",
      "destination": "image",
      "disposition": "enforce",
      "type": "corp"
    },
    "type": "coep",
    "url": "https://dummy.example/",
    "user_agent": "Mozilla/5.0... Chrome/92.0.4504.0"
  }
]

في ما يلي البيانات التي يمكنك العثور عليها في كل من هذه التقارير:

الحقل الوصف
age تمثّل هذه السمة عدد المللي ثانية بين الطابع الزمني للتقرير والوقت الحالي.
body بيانات التقرير الفعلية، والتي تم تحويلها إلى سلسلة JSON يتم تحديد الحقول الواردة في body التقرير من خلال type التقرير. ⚠️ تختلف نصوص التقارير باختلاف أنواعها.
type نوع التقرير، مثل csp-violation أو coep
url عنوان المستند أو العامل الذي تم إنشاء التقرير منه يتم إزالة البيانات الحسّاسة من عنوان URL هذا، مثل اسم المستخدم وكلمة المرور والجزء.
user_agent يمثّل هذا الحقل عنوان User-Agent للطلب الذي تم إنشاء التقرير منه.

التقارير التي تتطلّب بيانات اعتماد

تتلقّى نقاط نهاية إعداد التقارير التي لها المصدر نفسه مثل الصفحة التي تنشئ التقرير بيانات الاعتماد (ملفات تعريف الارتباط) في الطلبات التي تتضمّن التقارير.

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

متى وكيف يرسل المتصفّح التقارير؟

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

وهذا يعني أنّه لا داعي للقلق بشأن الأداء عند استخدام Reporting API.

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

المشاكل المتعلّقة بالطرف الأول والجهات الخارجية

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

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

مثال على الإيقاف نهائيًا

إذا تم إعداد عنوان Reporting-Endpoints على صفحتك، سيتم إرسال تقرير إلى نقطة النهاية بشأن واجهة برمجة التطبيقات المتوقّفة نهائيًا التي تستدعيها النصوص البرمجية التابعة لجهات خارجية والتي يتم تشغيلها على صفحتك. لن يتم إرسال واجهة برمجة التطبيقات المتوقّفة نهائيًا التي يتم استدعاؤها من خلال إطار iframe مضمّن في صفحتك إلى نقطة النهاية. لن يتم إنشاء تقرير إيقاف نهائي إلا إذا كان خادم iframe قد أعدّ نقاط نهاية Reporting-Endpoints، وسيتم إرسال هذا التقرير إلى أي نقطة نهاية أعدّها خادم iframe.
إذا تم إعداد عنوان Reporting-Endpoints على صفحتك، سيتم إرسال تقرير إلى نقطة النهاية بشأن واجهة برمجة التطبيقات المتوقّفة نهائيًا التي يتم استدعاؤها من خلال النصوص البرمجية التابعة لجهات خارجية والتي يتم تنفيذها على صفحتك. لن يتم إرسال واجهة برمجة التطبيقات المتوقّفة نهائيًا التي تم استدعاؤها من خلال إطار iframe مضمّن في صفحتك إلى نقطة النهاية. لن يتم إنشاء تقرير إيقاف نهائي إلا إذا كان خادم iframe قد أعدّ نقاط نهاية Reporting-Endpoints، وسيتم إرسال هذا التقرير إلى أي نقطة نهاية أعدّها خادم iframe.

دعم المتصفح

يلخّص الجدول التالي مدى توافق المتصفحات مع الإصدار 1 من Reporting API، أي مع العنوان Reporting-Endpoints. يتطابق دعم المتصفح لواجهة Reporting API الإصدار 0 (العنوان Report-To)، باستثناء نوع تقرير واحد: لا تتوافق ميزة تسجيل أخطاء الشبكة مع واجهة Reporting API الجديدة. راجِع دليل نقل البيانات للاطّلاع على التفاصيل.

نوع التقرير Chrome ‫Chrome iOS Safari Firefox Edge
مخالفة سياسة أمان المحتوى (المستوى 3 فقط)* ✔ نعم ✔ نعم ✔ نعم ‫✘ لا ✔ نعم
تسجيل أخطاء الشبكة ‫✘ لا ‫✘ لا ‫✘ لا ‫✘ لا ‫✘ لا
مخالفة COOP/COEP ✔ نعم ‫✘ لا ✔ نعم ‫✘ لا ✔ نعم
جميع الأنواع الأخرى: انتهاك سياسة المستندات، والإيقاف النهائي، والتدخّل، والأعطال ✔ نعم ‫✘ لا ‫✘ لا ‫✘ لا ✔ نعم

يلخّص هذا الجدول فقط إمكانية استخدام report-to مع العنوان الجديد Reporting-Endpoints. اطّلِع على نصائح حول نقل بيانات تقارير CSP إذا كنت تريد نقل البيانات إلى Reporting-Endpoints.

استخدام Reporting API

تحديد الوجهة التي يجب إرسال التقارير إليها

أمامك خياران:

  • إرسال التقارير إلى خدمة حالية لجمع التقارير
  • إرسال التقارير إلى أداة جمع تقارير تنشئها وتديرها بنفسك

الخيار 1: استخدام خدمة حالية لجمع التقارير

في ما يلي بعض الأمثلة على خدمات جمع التقارير:

إذا كنت تعرف حلولاً أخرى، يمكنك فتح مشكلة لإعلامنا بها، وسنعدّل هذه المشاركة.

بالإضافة إلى السعر، يجب مراعاة النقاط التالية عند اختيار أداة جمع التقارير: 🧐

  • هل يتيح هذا الجامع جميع أنواع التقارير؟ على سبيل المثال، لا تتوافق بعض حلول نقاط النهاية الخاصة بإعداد التقارير مع تقارير COOP/COEP.
  • هل توافق على مشاركة أي من عناوين URL الخاصة بتطبيقك مع خدمة خارجية لجمع التقارير؟ وحتى إذا أزال المتصفّح المعلومات الحسّاسة من عناوين URL هذه، قد يتم تسريب المعلومات الحسّاسة بهذه الطريقة. إذا كان ذلك يبدو محفوفًا بالمخاطر بالنسبة إلى تطبيقك، يمكنك تشغيل نقطة نهاية عملية الإبلاغ الخاصة بك.

الخيار 2: إنشاء أداة جمع تقارير وتشغيلها

إنّ إنشاء خادم خاص بك يتلقّى التقارير ليس أمرًا بسيطًا. للبدء، يمكنك إنشاء نسخة من نموذجنا الأولي البسيط. تم إنشاء هذا التطبيق باستخدام Express ويمكنه تلقّي التقارير وعرضها.

عند إنشاء أداة جمع التقارير الخاصة بك، يجب مراعاة ما يلي:

  • ابحث عن طلبات POST تتضمّن Content-Type بقيمة application/reports+json للتعرّف على طلبات التقارير التي يرسلها المتصفّح إلى نقطة النهاية.
  • إذا كانت نقطة النهاية تستخدم مصدرًا مختلفًا عن موقعك الإلكتروني، تأكَّد من أنّها تتيح طلبات CORS المسبقة.

الخيار 3: الجمع بين الخيارَين 1 و2

قد ترغب في السماح لمقدّم خدمة معيّن بالتعامل مع بعض أنواع التقارير، ولكنك قد تفضّل استخدام حل داخلي للتعامل مع أنواع أخرى.

في هذه الحالة، اضبط نقاط نهاية متعددة على النحو التالي:

Reporting-Endpoints: endpoint-1="https://reports-collector.example", endpoint-2="https://my-custom-endpoint.example"

ضبط عنوان Reporting-Endpoints

اضبط عنوان الاستجابة Reporting-Endpoints. يجب أن تكون قيمته واحدة أو سلسلة من أزواج المفاتيح والقيم مفصولة بفواصل:

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

في حال نقل البيانات من واجهة Reporting API القديمة إلى واجهة Reporting API الجديدة، قد يكون من المنطقي ضبط كلّ من Reporting-Endpoints وReport-To. يمكنك الاطّلاع على التفاصيل في دليل نقل البيانات. على وجه الخصوص، إذا كنت تستخدم إعداد التقارير بشأن انتهاكات Content-Security-Policy باستخدام التوجيه report-uri فقط، يمكنك الاطّلاع على خطوات نقل البيانات لإعداد تقارير CSP.

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

المفاتيح (أسماء نقاط النهاية)

يمكن أن يكون كل مفتاح اسمًا من اختيارك، مثل main-endpoint أو endpoint-1. يمكنك اختيار ضبط نقاط نهاية مختلفة الأسماء لأنواع التقارير المختلفة، مثل my-coop-endpoint وmy-csp-endpoint. باستخدام هذه الميزة، يمكنك توجيه التقارير إلى نقاط نهاية مختلفة حسب نوعها.

إذا كنت تريد تلقّي تقارير التدخّل أو الإيقاف النهائي أو الأعطال أو مزيج من هذه التقارير، اضبط نقطة نهاية باسم default.

إذا لم يحدّد العنوان Reporting-Endpoints أي نقطة نهاية default، لن يتم إرسال تقارير من هذا النوع (مع أنّه سيتم إنشاؤها).

القيم (عناوين URL)

كل قيمة هي عنوان URL من اختيارك، وسيتم إرسال التقارير إليه. يعتمد عنوان URL الذي سيتم ضبطه هنا على ما قرّرته في الخطوة 1.

عنوان URL لنقطة النهاية:

أمثلة

Reporting-Endpoints: my-coop-endpoint="https://reports.example/coop", my-csp-endpoint="https://reports.example/csp", default="https://reports.example/default"

يمكنك بعد ذلك استخدام كل نقطة نهاية مسماة في السياسة المناسبة، أو استخدام نقطة نهاية واحدة في جميع السياسات.

أين يمكن ضبط العنوان؟

في واجهة Reporting API الجديدة، وهي الواجهة التي يتناولها هذا المنشور، يتم تحديد نطاق التقارير على مستوى المستندات. وهذا يعني أنّه بالنسبة إلى مصدر معيّن، يمكن للمستندات المختلفة، مثل site.example/page1 وsite.example/page2، إرسال التقارير إلى نقاط نهاية مختلفة.

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

إليك مثال في Express:

const REPORTING_ENDPOINT_BASE = 'https://report.example';
const REPORTING_ENDPOINT_MAIN = `${REPORTING_ENDPOINT_BASE}/main`;
const REPORTING_ENDPOINT_DEFAULT = `${REPORTING_ENDPOINT_BASE}/default`;

app.use(function (request, response, next) {
  // Set up the Reporting API
  response.set(
    'Reporting-Endpoints',
    `main-endpoint="${REPORTING_ENDPOINT_MAIN}", default="${REPORTING_ENDPOINT_DEFAULT}"`,
  );
  next();
});

تعديل سياساتك

بعد ضبط عنوان Reporting-Endpoints، أضِف توجيه report-to إلى كل عنوان سياسة تريد تلقّي تقارير عن انتهاكاتها. يجب أن تكون قيمة report-to إحدى نقاط النهاية المسماة التي تم ضبطها.

يمكنك استخدام نقطة النهاية المتعددة لسياسات متعددة، أو استخدام نقاط نهاية مختلفة في السياسات.

بالنسبة إلى كل سياسة، يجب أن تكون قيمة report-to إحدى نقاط النهاية المسماة التي أعددتها.

لا يلزم توفير report-to لتقارير الإيقاف النهائي والتدخّل والأعطال. ولا ترتبط هذه التقارير بأي سياسة. ويتم إنشاء هذه البيانات طالما تم إعداد نقطة نهاية default، ويتم إرسالها إلى نقطة النهاية هذه.default

مثال

# Content-Security-Policy violations and Document-Policy violations
# will be sent to main-endpoint
Content-Security-Policy: script-src 'self'; object-src 'none'; report-to main-endpoint;
Document-Policy: document-write=?0;report-to=main-endpoint;
# Deprecation reports don't need an explicit endpoint because
# these reports are always sent to the default endpoint

تصحيح أخطاء إعداد التقارير

إنشاء التقارير عن قصد

عند إعداد Reporting API، من المحتمل أن تحتاج إلى انتهاك سياساتك عمدًا للتحقّق من إنشاء التقارير وإرسالها على النحو المتوقّع.

توفير الوقت

قد يتم إرسال التقارير بتأخير يبلغ دقيقة واحدة تقريبًا، وهو وقت طويل عند تصحيح الأخطاء. 😴 لحسن الحظ، عند تصحيح الأخطاء في Chrome، يمكنك استخدام العلامة --short-reporting-delay لتلقّي التقارير فور إنشائها.

نفِّذ الأمر التالي في الوحدة الطرفية لتفعيل هذا الخيار:

YOUR_PATH/TO/EXECUTABLE/Chrome --short-reporting-delay

استخدام "أدوات مطوّري البرامج"

في Chrome، استخدِم "أدوات مطوّري البرامج" للاطّلاع على التقارير التي تم إرسالها أو سيتم إرسالها.

اعتبارًا من تشرين الأول (أكتوبر) 2021، أصبحت هذه الميزة تجريبية. لاستخدامها، اتّبِع الخطوات التالية:

  1. استخدام الإصدار 96 والإصدارات الأحدث من Chrome (يمكنك التحقّق من الإصدار عن طريق كتابة chrome://version في المتصفّح)
  2. اكتب أو الصِق chrome://flags/#enable-experimental-web-platform-features في شريط العناوين في Chrome.
  3. انقر على مفعَّل.
  4. إعادة تشغيل المتصفّح
  5. افتح "أدوات مطوري البرامج في Chrome".
  6. في "أدوات مطوّري البرامج في Chrome"، افتح "الإعدادات". ضمن "التجارب"، انقر على تفعيل لوحة Reporting API في لوحة "التطبيق".
  7. أعِد تحميل "أدوات مطوّري البرامج".
  8. أعِد تحميل الصفحة. سيتم إدراج التقارير التي تم إنشاؤها في الصفحة التي تم فتح "أدوات مطوّري البرامج" فيها ضمن لوحة التطبيق في "أدوات مطوّري البرامج في Chrome"، وذلك ضمن Reporting API.
لقطة شاشة من &quot;أدوات مطوّري البرامج&quot; تعرض التقارير
تعرض "أدوات مطوّري البرامج في Chrome" التقارير التي تم إنشاؤها على صفحتك وحالتها.

حالة التقرير

يخبرك عمود الحالة ما إذا تم إرسال بلاغ بنجاح.

الحالة الوصف
Success أرسل المتصفّح التقرير وردّت نقطة النهاية برمز نجاح (200 أو رمز استجابة ناجحة آخر 2xx).
Pending يحاول المتصفّح إرسال التقرير.
Queued تم إنشاء التقرير ولا يحاول المتصفّح إرساله. يظهر التقرير على شكل Queued في إحدى الحالتَين التاليتَين:
  • التقرير جديد وينتظر المتصفّح وصول المزيد من التقارير قبل محاولة إرساله.
  • التقرير ليس جديدًا، فقد سبق أن حاول المتصفّح إرساله وتعذّر عليه ذلك، وهو ينتظر قبل إعادة المحاولة.
MarkedForRemoval بعد إعادة المحاولة لفترة من الوقت (Queued)، توقّف المتصفّح عن محاولة إرسال التقرير وسيزيله قريبًا من قائمة التقارير التي سيتم إرسالها.

تتم إزالة البلاغات بعد فترة من الوقت، سواء تم إرسالها بنجاح أم لا.

تحديد المشاكل وحلّها

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

لم يتم إنشاء التقارير

تم إنشاء التقارير التي تظهر في "أدوات مطوّري البرامج" بشكل صحيح. إذا كان التقرير الذي تتوقّعه لا يظهر في هذه القائمة، اتّبِع الخطوات التالية:

  • راجِع report-to في سياساتك. وفي حال ضبط هذا الإعداد بشكل غير صحيح، لن يتم إنشاء تقرير. انتقِل إلى تعديل سياساتك لحلّ هذه المشكلة. هناك طريقة إضافية لتحديد المشاكل وحلّها، وهي التحقّق من وحدة تحكّم أدوات المطوّرين في Chrome: إذا ظهر خطأ في وحدة التحكّم بشأن الانتهاك الذي توقعته، يعني ذلك أنّه من المحتمل أنّ سياستك تم ضبطها بشكل صحيح.
  • يُرجى العِلم أنّ هذه القائمة ستعرض فقط التقارير التي تم إنشاؤها للمستند الذي تم فتح &quot;أدوات المطوّرين&quot; فيه. على سبيل المثال، إذا كان موقعك الإلكتروني site1.example يتضمّن إطار iframe site2.example ينتهك إحدى السياسات وبالتالي يؤدي إلى إنشاء تقرير، لن يظهر هذا التقرير في &quot;أدوات مطوّري البرامج&quot; إلا إذا فتحت إطار iframe في نافذة منفصلة وفتحت &quot;أدوات مطوّري البرامج&quot; لهذه النافذة.

يتم إنشاء التقارير ولكن لا يتم إرسالها أو استلامها

ماذا لو كان بإمكانك الاطّلاع على تقرير في &quot;أدوات مطوّري البرامج&quot;، ولكن لم يتلقَّه نقطة النهاية؟

  • احرص على استخدام فواصل زمنية قصيرة. قد يكون السبب في عدم ظهور تقرير هو أنّه لم يتم إرساله بعد.
  • تحقَّق من إعدادات عنوان Reporting-Endpoints. إذا كانت هناك مشكلة في التقرير، لن يتم إرسال التقرير الذي تم إنشاؤه بشكل صحيح. في هذه الحالة، ستبقى حالة التقرير Queued في &quot;أدوات المطوّرين&quot; (قد تتغيّر إلى Pending، ثم تعود بسرعة إلى Queued عند محاولة التسليم). في ما يلي بعض الأخطاء الشائعة التي قد تؤدي إلى حدوث ذلك:

  • يتم استخدام نقطة النهاية ولكن لم يتم ضبطها. مثال:

رمز يتضمّن خطأ
 Document-Policy: document-write=?0;report-to=endpoint-1;
 Reporting-Endpoints: default="https://reports.example/default"

يجب إرسال تقارير انتهاك Document-Policy إلى endpoint-1، ولكن لم يتم ضبط اسم نقطة النهاية هذا في Reporting-Endpoints.

  • نقطة النهاية default غير متوفّرة. سيتم إرسال بعض أنواع التقارير، مثل تقارير الإيقاف وتقارير التدخّل، إلى نقطة النهاية المسماة default فقط. يمكنك الاطّلاع على مزيد من المعلومات في مقالة ضبط عنوان Reporting-Endpoints.

  • ابحث عن مشاكل في بنية عناوين السياسات، مثل علامات الاقتباس المفقودة. عرض التفاصيل

  • تأكَّد من أنّ نقطة النهاية يمكنها التعامل مع الطلبات الواردة.

    • تأكَّد من أنّ نقطة النهاية تتيح طلبات CORS المسبقة. إذا لم يكن كذلك، لن يتمكّن من تلقّي التقارير.

    • اختبِر سلوك نقطة النهاية. لإجراء ذلك، بدلاً من إنشاء التقارير يدويًا، يمكنك محاكاة المتصفّح من خلال إرسال طلبات إلى نقطة النهاية تشبه الطلبات التي يرسلها المتصفّح. نفِّذ ما يلي:

    curl --header "Content-Type: application/reports+json" \
      --request POST \
      --data '[{"age":420,"body":{"columnNumber":12,"disposition":"enforce","lineNumber":11,"message":"Document policy violation: document-write is not allowed in this document.","policyId":"document-write","sourceFile":"https://dummy.example/script.js"},"type":"document-policy-violation","url":"https://dummy.example/","user_agent":"xxx"},{"age":510,"body":{"blockedURL":"https://dummy.example/img.jpg","destination":"image","disposition":"enforce","type":"corp"},"type":"coep","url":"https://dummy.example/","user_agent":"xxx"}]' \
      YOUR_ENDPOINT
    

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

Report-Only

تعمل عناوين السياسات -Report-Only وReporting-Endpoints معًا.

ستتلقّى نقاط النهاية التي تم ضبطها في Reporting-Endpoints وتحديدها في حقل report-to ضمن Content-Security-Policy وCross-Origin-Embedder-Policy وCross-Origin-Opener-Policy تقارير عند انتهاك هذه السياسات.

يمكن أيضًا تحديد نقاط النهاية التي تم ضبطها في Reporting-Endpoints في الحقل report-to ضمن Content-Security-Policy-Report-Only وCross-Origin-Embedder-Policy-Report-Only وCross-Origin-Opener-Policy-Report-Only. سيتلقّون أيضًا تقارير عند انتهاك هذه السياسات.

على الرغم من إرسال التقارير في كلتا الحالتين، لا تفرض عناوين -Report-Only السياسات: لن يحدث أي خلل أو حظر فعلي، ولكن ستتلقّى تقارير بشأن ما كان سيحدث فيه خلل أو سيتم حظره.

ReportingObserver

يمكن أن تساعدك ReportingObserver JavaScript API في مراقبة التحذيرات من جهة العميل.

تُنشئ السمة ReportingObserver والعنوان Reporting-Endpoints تقارير تبدو متشابهة، ولكنّها تتيح حالات استخدام مختلفة قليلاً.

استخدِم ReportingObserver في الحالات التالية:

  • إذا كنت تريد مراقبة عمليات الإيقاف النهائي أو تدخلات المتصفّح فقط تعرض واجهة برمجة التطبيقات ReportingObserver تحذيرات من جهة العميل، مثل عمليات الإيقاف النهائي والتدخّلات من المتصفّح، ولكن على عكس واجهة برمجة التطبيقات Reporting-Endpoints، لا تسجّل أي أنواع أخرى من التقارير، مثل انتهاكات سياسة أمان المحتوى أو سياسة المنشأ المشترك أو سياسة تضمين المحتوى.
  • عليك التفاعل مع هذه الانتهاكات في الوقت الفعلي. يتيح ReportingObserver إرفاق دالة ردّ الاتصال بحدث انتهاك.
  • تريد إرفاق معلومات إضافية بتقرير للمساعدة في تصحيح الأخطاء باستخدام الدالة الرجعية المخصّصة.

يتم ضبط ReportingObserver من جهة العميل فقط، ما يعني أنّه يمكنك استخدامه حتى إذا لم يكن لديك إذن بالتحكّم في العناوين من جهة الخادم وتعذّر عليك ضبط Reporting-Endpoints.

محتوى إضافي للقراءة

الصورة الرئيسية من Nine Koepfer / @enka80 على Unsplash، تم تعديلها. نشكر إيان كللاند وإيجي كيتامورا وميليكا ميهايليا على مراجعاتهم واقتراحاتهم بشأن هذا المستند.