التأكُّد من فعالية سياسة أمان المحتوى (CSP) ضد هجمات حقن الشيفرة المصدريّة عبر موقع وسيط (XSS)

تساعد سياسة أمان المحتوى (CSP) في ضمان أن أي محتوى يتم تحميله في الصفحة يثق به مالك الموقع الإلكتروني. يحد مقدمو خدمة CSP من هجمات البرمجة النصية على مستوى المواقع الإلكترونية (XSS) لأنه يمكنهم حظر النصوص البرمجية غير الآمنة التي يُدخِلها المهاجمون. ومع ذلك، يمكن تجاوز سياسة أمان المحتوى بسهولة إذا لم تكن صارمة بدرجة كافية. راجِع المقالة الحدّ من النصوص البرمجية على المواقع الإلكترونية (XSS) باستخدام سياسة صارمة لأمان المحتوى (CSP) للحصول على مزيد من المعلومات. يجمع أداة Lighthouse في هذا المستند "مقدّمي الخدمات لصنّاع المحتوى" (CSP) الذين يتم تطبيقهم على المستند الرئيسي، كما يبلّغ عن المشاكل الواردة من مقيّم CSP في حال تم تجاوزها.

يحذر تقرير Lighthouse من عدم العثور على سياسة CSP في وضع التنفيذ.
يحذر تقرير Lighthouse من عدم العثور على سياسة CSP في وضع التنفيذ.

الممارسات المطلوبة لسياسة أمان المحتوى (CSP) غير المسموح بها

نفِّذ الممارسات التالية لضمان عدم تجاوز سياسة أمان المحتوى (CSP). وفي حال كان من الممكن تجاوز سياسة أمان المحتوى (CSP)، ستصدر أداة Lighthouse تحذيرًا عالي الخطورة.

استهداف سياسة أمان المحتوى (CSP) XSS

لاستهداف XSS، يجب أن يتضمّن سياسة CSP توجيهات script-src وobject-src وbase-uri. ويجب أيضًا أن يكون CSP خاليًا من أخطاء البنية.

يحمي script-src وobject-src صفحة من نصوص برمجية غير آمنة ومكوّنات إضافية غير آمنة على التوالي. وبدلاً من ذلك، يمكن استخدام default-src لإعداد سياسة عامة بدلاً من العديد من التوجيهات، بما في ذلك script-src وobject-src.

يمنع base-uri إدخال علامات <base> غير مصرَّح بها يمكن استخدامها لإعادة توجيه جميع عناوين URL النسبية (مثل النصوص البرمجية) إلى نطاق يتحكّم فيه مهاجم.

يستخدم سياسة أمان المحتوى (CSP) nonces أو hashes لتجنب عمليات تجاوز القائمة المسموح بها.

إنّ سياسة أمان المحتوى (CSP) التي تضبط قائمة مسموحًا بها لمتصفِّح script-src تعتمد على افتراض أنّ جميع الردود الواردة من نطاق موثوق به آمنة ويمكن تنفيذها كنصوص برمجية. ومع ذلك، لا ينطبق هذا الافتراض على التطبيقات الحديثة، إذ تسمح بعض الأنماط الشائعة وغير الشائعة، مثل عرض واجهات JSONP واستضافة نُسخ من مكتبة AngularJS، للمهاجمين بالهروب من حدود سياسة أمان المحتوى (CSP).

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

على سبيل المثال، يستخدم هذا الرمز نقطة نهاية JSONP مستضافة على نطاق موثوق به لإدخال نص برمجي يتحكّم فيه مهاجم:

سياسة أمان المحتوى (CSP):

script-src https://trusted.example.com

HTML:

<script src="https://trusted.example.com/path/jsonp?callback=alert(document.domain)//"></script>

لتجنُّب تجاوزها، يجب أن تسمح سياسة أمان المحتوى (CSP) بالنصوص البرمجية بشكل فردي باستخدام nonces أو تجزئات واستخدام "strict- Dynamic" بدلاً من قائمة مسموح بها.

اقتراحات إضافية بشأن سياسة أمان المحتوى (CSP) آمنة

نفِّذ الممارسات التالية لتعزيز الأمان والتوافق. في حال عدم اتّباع سياسة أمان المحتوى لأحد الاقتراحات، ستُصدر أداة Lighthouse تحذيرًا متوسط الخطورة.

ضبط إعداد تقارير سياسة أمان المحتوى (CSP)

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

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

تحديد سياسة أمان المحتوى في عنوان HTTP

يمكن تعريف سياسة أمان المحتوى (CSP) في علامة وصفية على النحو التالي:

<meta http-equiv="Content-Security-Policy" content="script-src 'none'">

ومع ذلك، يجب تحديد سياسة CSP في عنوان استجابة HTTP إذا أمكن. يؤدي الحقن قبل العلامة الوصفية إلى تجاوز سياسة أمان المحتوى (CSP). بالإضافة إلى ذلك، لا يمكن استخدام frame-ancestors وsandbox وإعداد التقارير في سياسة أمان المحتوى (CSP) للعلامة الوصفية.

التأكُّد من توافق سياسة أمان المحتوى مع الأنظمة القديمة

لا تتوافق بعض المتصفِّحات مع nonces/hashes (خاصية بـ CSP)، لذا ننصح بإضافة unsafe-inline كإجراء احتياطي للمتصفِّحات غير المتوافقة. إذا كان المتصفّح يتوافق مع nonces/hashes، سيتم تجاهل unsafe-inline.

وبالمثل، لا يتوافق strict-dynamic مع كل المتصفحات. ويُنصَح بضبط قائمة مسموح بها كعنصر احتياطي لأي متصفِّحات غير متوافقة. سيتم تجاهل القائمة المسموح بها في المتصفِّحات المتوافقة مع strict-dynamic.

كيفية تطوير سياسة أمان محتوى (CSP) صارمة

في ما يلي مثال على استخدام سياسة CSP صارمة مع سياسة غير مستندة إلى قاعدة بيانات.

سياسة أمان المحتوى (CSP):

script-src 'nonce-random123' 'strict-dynamic' 'unsafe-inline' https:;
object-src 'none';
base-uri 'none';
report-uri https://reporting.example.com;

HTML:

<script nonce="random123" src="https://trusted.example.com/trusted_script.js"></script>

ستكون القيمة random123 من جهة الخادم على مستوى سلسلة base64 في كل مرة يتم فيها تحميل الصفحة. تم تجاهل unsafe-inline وhttps: في المتصفحات الحديثة بسبب nonce وstrict-dynamic. لمزيد من المعلومات عن استخدام سياسة CSP صارمة، يُرجى الاطّلاع على دليل سياسة CSP الصارم.

يمكنك التحقّق من سياسة أمان المحتوى (CSP) لرصد عمليات التجاوز المحتمَلة باستخدام أداة Lighthouse وCSP Evaluator. إذا كنت تريد اختبار سياسة أمان محتوى (CSP) جديدة بدون المخاطرة بتعطُّل الصفحات الحالية، حدِّدها في وضع إعداد التقارير فقط باستخدام Content-Security-Policy-Report-Only كاسم العنوان. سيؤدي ذلك إلى إرسال انتهاكات سياسة أمان المحتوى إلى أي وجهات إعداد تقارير تم ضبطها باستخدام report-to وreport-uri، ولكنها لن تفرض سياسة CSP في الواقع.