طريقة الاستخدام
- اكتب التوجيهات في السياسة، سطراً لكل توجيه، وبأسمائها كما هي مكتوبة، مثل script-src.
- اختر طريقة الإرسال: يفرض Content-Security-Policy السياسة، أما Content-Security-Policy-Report-Only فهي الترويسة التي تختبر بها أولاً.
- اقرأ القاعدة السارية لكل مورد لترى التوجيه الذي يغطي النصوص البرمجية والأنماط والصور والإطارات.
- انسخ سطر الترويسة إلى خادمك، وأصلح كل تحذير مدرج أسفل النتيجة.
أي قاعدة تسري على المورد
يتحقق المتصفح من كل نوع من الموارد مقابل توجيه واحد. فإذا كان ذلك التوجيه غير موجود، يرجع إلى البديل في سلسلة، ويُظهر الجدول السلسلة التي اتبعها. وتأتي السلاسل من CSP Level 3، القسم 6.8.3.
- النصوص البرمجية: script-src-elem، ثم script-src، ثم default-src.
- معالِجات الأحداث المضمّنة: script-src-attr، ثم script-src، ثم default-src.
- أوراق الأنماط: style-src-elem، ثم style-src، ثم default-src. وتتبع سمات الأنماط المضمّنة النمط نفسه مع style-src-attr.
- الإطارات: frame-src، ثم child-src، ثم default-src.
- العمّال: worker-src، ثم child-src، ثم script-src، ثم default-src.
- الصور والخطوط والوسائط والإضافات وملفات البيان وطلبات fetch: توجيهها الخاص، ثم default-src.
ما يقرؤه الفاحص
تُفصل التوجيهات بفواصل منقوطة، ويقبل هذا الفاحص أسطراً جديدة أيضاً. يُقرأ الاسم حتى أول مسافة، ولا يفرّق بين الأحرف الكبيرة والصغيرة. وحين يظهر توجيه مرتين، يُحسب الأول ويُتجاهل التكرار (CSP Level 3، القسم 2.2.1).
- الكلمات المفتاحية مثل 'self' و'none' تُكتب بين علامتي تنصيص مفردتين. ويجب أن تقف 'none' وحدها في قائمتها.
- الـ nonce هو 'nonce-' متبوعة بقيمة base64. والـ hash هو sha256 أو sha384 أو sha512، وشرطة، ثم قيمة base64 (القسم 2.3.1).
- لا تجوز الفاصلة داخل قيمة توجيه، لأنها تفصل بين السياسات في الترويسة.
ما لا يفعله الفاحص
- لا يحمّل الصفحة ولا يختبر السياسة في متصفح. يعرض الجدول القاعدة التي سيستخدمها المتصفح، لا إن كانت صفحتك ستعمل بعد ذلك.
- يتحقق من كتابة الكلمات المفتاحية والـ nonce والـ hash، لكنه لا يفحص المضيفات ومصادر البروتوكول بالتفصيل.
- لا يحكم على التوجيهات التي لا يعرفها، مثل sandbox، فتبقى في سطر الترويسة كما هي.
مثال محسوب: السياسة النموذجية
مع السياسة النموذجية، تستخدم النصوص البرمجية script-src لأن script-src-elem غير موجود. ولا توجد frame-src أو child-src للإطارات، لذلك ترجع إلى default-src. ولا توجد worker-src أو child-src للعمّال، لذلك تستخدم script-src. يحمل التوجيه style-src القيمة 'unsafe-inline'، ويبلّغ الفاحص عنها تحذيراً واحداً.
| المورد | المفحوص بالترتيب | القاعدة المستخدمة |
|---|---|---|
| النصوص البرمجية (عناصر script) | script-src-elem، script-src، default-src | script-src |
| الإطارات (iframe) | frame-src، child-src، default-src | default-src |
| العمّال (Workers) | worker-src، child-src، script-src، default-src | script-src |
الأسئلة الشائعة
لماذا يُظهر الجدول قاعدة لم أكتبها للنصوص البرمجية؟
المورد الذي لا يملك توجيهاً خاصاً به يستخدم التوجيه الذي يرجع إليه. بالنسبة إلى النصوص البرمجية هو script-src-elem، ثم script-src، ثم default-src. ويعرض الجدول القاعدة التي سيستخدمها المتصفح، لذلك قد يعطيك غياب script-src قاعدة مع ذلك.
ماذا يسمح 'unsafe-inline'؟
يسمح بالنصوص البرمجية أو الأنماط المضمّنة في الأماكن التي يغطيها التوجيه. ووجود nonce أو hash في قائمة المصادر نفسها يجعل المتصفحات تتجاهل 'unsafe-inline' (CSP Level 3، القسم 6.7.3.2)، لذلك استخدم أحدهما للشيفرة المضمّنة التي تحتاجها.
هل أكتب report-uri أم report-to؟
اكتب report-to. تصفه MDN بأنه التوجيه الذي يحل محل report-uri. وما دام report-to غير مدعوم على نطاق واسع، تنصح MDN بإرسال الاثنين، ويحذّرك الفاحص حين يوجد report-uri.
لماذا يُعرض أحد توجيهاتي كتوجيه غير معروف؟
يحكم الفاحص على التوجيهات التي تشحنها المتصفحات وتوثّقها MDN فقط. الاسم الذي لا يعرفه يبقى في سطر الترويسة كما هو، لكنه لا يظهر في الجدول ولا يُحكم عليه.
هل ترسل الأداة سياستي إلى أي مكان؟
لا. تُبنى الترويسة في متصفحك، ولا يُرسل ما تكتبه إلينا ولا يُخزَّن، ولا تُختبر السياسة في أي موقع.
هل CSP Level 3 معيار نهائي؟
ليس بعد. النص الذي يتبعه الفاحص مسودة عمل من W3C بتاريخ 27 أكتوبر 2026، وهي مسودة على مسار التوصية. اقرأ أحدث نسخة قبل أن تعتمد على قاعدة في سياسة إنتاج.
المصادر
- CSP Level 3، مسودة عمل من W3C بتاريخ 27 أكتوبر 2026 (باللغة الإنجليزية): الأقسام 2.2 و2.3.1 و4.4.1 و6.7.3.2 و6.8.3
- MDN (باللغة الإنجليزية): ترويسة Content-Security-Policy وتوجيهاتها وبدائلها
آخر مراجعة للأرقام والنص: الثلاثاء، 30 جمادى الأولى 1448 بعد الهجرة.