بدك تفعّل CSP بلا ما ينكسر موقعك؟ ابدأ بـ Report-Only

حط سياسة CSP بهيدر Content-Security-Policy-Report-Only أول: المتصفح بيسجّل كل سكربت كان رح ينمنع وبيبعتلك تقرير، والموقع بيضل شغّال. صلّح المخالفات، وبعدين فعّلها.

نُشر في 3 دقائق قراءة#أمن التطبيقات#تطوير الويب

تعليق واحد على موقعك، ما انعمله escape، بيكفي ليشغّل كود بمتصفح كل حدا بيفتح الصفحة. والحماية يلي بتسكّر هالباب هيدر واحد، بس كتير مطوّرين بيجرّبوه مرة، بينكسر نص الموقع، وبيشيلوه. بهالمقال رح تحطه بطريقة ما بتكسر شي، وتعرف بالضبط شو لازم تصلّح قبل ما تفعّله.

شو هو Content Security Policy؟

الـ Content Security Policy قائمة تعليمات بيبعتها موقعك للمتصفح، بتقلّه شو مسموح لكود الصفحة يحمّل ويشغّل.

حسب دليل الـ CSP على MDN، استعمالها الأساسي حماية من الـ XSS، يعني لما مهاجم يحقن كود بموقعك. وأول شي بيتغيّر: إذا السياسة فيها default-src أو script-src، الـ JavaScript المكتوب جوّا الصفحة ما بيشتغل إلا إذا سمحتله بطريقة واضحة.

ليش تفعيل CSP دغري بيكسر المواقع؟

تفعيل CSP دغري بيكسر المواقع لأنو المتصفح بيوقّف كل سكربت ما بتسمحله السياسة، والمطوّر نادراً بيعرف كل السكربتات يلي صفحاته عم تحمّلها.

سكربت الإحصائيات، وزر الدردشة، وسطر onclick بقالب قديم، وكود حطّه حدا بالفريق من سنة: كلهن بيوقفوا بنفس اللحظة. وهون بتصير الغلطة يلي بتلغي كل الشغل: المطوّر بيزيد 'unsafe-inline' لحتى يرجع الموقع يشتغل. نفس دليل MDN بيحذّر منها بالاسم، لأنها بتلغي جزء كبير من فايدة الـ CSP: السكربت المكتوب جوّا الصفحة من أشهر طرق الـ XSS، وهو بالزبط يلي السياسة موجودة لتمنعه.

فالغلطة كانت بالترتيب: فعّلنا المنع قبل ما نعرف شو رح ينمنع.

كيف بيحل Content-Security-Policy-Report-Only هالمشكلة؟

هيدر Content-Security-Policy-Report-Only بيقرا نفس السياسة بس ما بيمنع شي: المتصفح بيسجّل كل مخالفة وبيبعتها لعنوان إنت بتحدده، والموقع بيضل شغّال متل ما هو.

يعني بدل ما تعرف شو انكسر من الزباين، بتعرف شو كان رح ينكسر من التقارير. حسب صفحة الهيدر على MDN، التوجيه report-to لازم يكون موجود لحتى تنبعت التقارير، وبدونه الهيدر ما بيعمل شي. والهيدر متاح بكل المتصفحات من آب 2016. هيك بيطلع مع عنوان التقارير:

Reporting-Endpoints: csp-endpoint="https://example.com/csp-reports"
Content-Security-Policy-Report-Only: script-src 'nonce-{RANDOM}'; object-src 'none'; base-uri 'none'; report-to csp-endpoint

السياسة بهالمثال هي السياسة الصارمة يلي بينصح فيها دليل MDN: السكربت بيشتغل بس إذا معه الـ nonce الصح. والـ nonce قيمة عشوائية السيرفر بيولّدها جديدة لكل رد، وبيحطها بالهيدر وبخاصية nonce بكل وسم <script> بدك ياه يشتغل. سكربت حقنه مهاجم ما بيعرف القيمة، فالمتصفح بيرفضه.

كيف تنقل موقعك لـ CSP بالترتيب؟

بتنقل موقعك لـ CSP بأربع خطوات، وما بتفعّل المنع إلا بالأخيرة:

  1. حط الهيدرين يلي فوق من السيرفر أو من إعدادات الاستضافة، مش بوسم <meta>: سياسة Report-Only ما بتنقبل هونيك. بعدها الموقع بيشتغل عادي، والتقارير بتبلّش توصل.

  2. افتح الصفحات المهمة بنفسك، تسجيل الدخول والدفع ولوحة التحكم، وشوف الـ Console بالمتصفح والتقارير يلي وصلت. كل سطر فيه السكربت يلي كان رح ينمنع.

  3. صلّح كل مخالفة: انقل الكود المكتوب جوّا الصفحة لملف، أو حطله الـ nonce من السيرفر، واستعمل addEventListener بدال onclick وأخواتها. ارجع للخطوة 2 لحد ما ما يضل غير تقارير من إضافات المتصفح.

  4. غيّر اسم الهيدر لـ Content-Security-Policy. هلق المنع شغّال، وأي تعديل جاي على السياسة بتجرّبه أول بهيدر Report-Only تاني جنبه.

من وين تبلّش هلق؟

ابدأ بصفحة وحدة إلها وزن، متل صفحة تسجيل الدخول، وحط عليها Report-Only اليوم. بعد يوم بتعرف قديش سكربت بدّه شغل.

وإذا موقعك بيحمّل سكربتات من CDN، كمّل مع قفل سكربتات الـ CDN بـ Subresource Integrity، ولهيدر تاني بيحمي أول طلب، شوف تفعيل HSTS صح. وإذا بدك حدا يجرّب يحقن كود بموقعك قبل ما يعملها غيرك، هاد شغل مُحَصَّن.

كم سكربت مكتوب جوّا صفحاتك هلق، برأيك؟

أسئلة شائعة

بقدر أحط Report-Only بوسم meta بالصفحة؟

لأ. توثيق MDN بيقول إنو سياسة Report-Only ما بتنحط بعنصر meta، فلازم تطلع كهيدر من السيرفر أو من إعدادات الاستضافة.

ليش ما بحط unsafe-inline وبخلص؟

لأنو MDN بتقول إنو unsafe-inline بيلغي جزء كبير من فايدة CSP. السكربت المكتوب جوّا الصفحة من أشهر طرق XSS، وهاد بالزبط يلي بدك تمنعه.

قديش لازم يضل الموقع على Report-Only قبل ما فعّل؟

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

شارك المقال

نسخة Markdown

مقالات أخرى