منع XSS لا يعتمد على خطوة واحدة. التحقق من الإدخال والترميز عند الإخراج يظلان أساسيين، لكنهما قد يفشلان في موضع أو Template أو dependency. Content Security Policy تضيف طبقة دفاع في المتصفح تحدد من أين يسمح بتحميل Script و Style و Frame وموارد أخرى. الفكرة المهمة هي تقليل قدرة كود غير مقصود على التنفيذ حتى لو وصل HTML ضار إلى الصفحة. CSP ليست بديلًا عن إصلاح الثغرة؛ هي طبقة تقلل أثر بعض أنواعها وتكشفها مبكرًا.
ابدأ من سياسة مراقبة لا من حظر شامل
إطلاق سياسة صارمة مباشرة على موقع قديم قد يكسر Scripts أو Widgets كثيرة. ابدأ ب ـContent-Security-Policy-Report-Only، راقب الانتهاكات، وصنف المصادر الشرعية قبل الانتقال إلى enforcement. لا تفتح مصادر واسعة لمجرد إسكات التقارير؛ كل استثناء يجب أن يكون له سبب.
استخدم nonce أو hash لل ـscripts المسموح بها
بدل السماح لكل inline script، أنشئ nonce عشوائية لكل response وضعها في header وعلى scripts الموثوقة. أو استخدم hash للمحتوى الثابت. nonce يجب أن تكون غير قابلة للتنبؤ ولا يعاد استخدامها كقيمة ثابتة بين الصفحات.
خطوات عملية
- أضف CSP Report-Only.
- حدد script-src الأساسي.
- ولّد nonce لكل response.
- ضع nonce فقط على scripts المقصودة.
- راقب violations.
- انتقل إلى enforcement بعد اختبار الصفحات الأساسية.
قلل سطح المصادر الخارجية
كل CDN أو analytics أو widget تضيف origin إلى السياسة وربما تضيف كودًا لا تتحكم في تحديثه. راجع هل تحتاج المصدر فعلًا، وهل يمكن self-host بعض الموارد. لا تستخدم wildcard واسع إذا كانت الخدمة تعمل من host محددة.
frame-ancestors و object-src و base-uri مهمة أيضًا
CSP ليست script-src فقط. frame-ancestors تساعد على التحكم في تضمين موقعك داخل frames، object-src 'none' تقلل سطح plugins القديمة، و base-uri تقيد تغيير base URL الذي قد يؤثر على الروابط النسبية. بناء baseline جيدة يبدأ غالبًا بهذه القيود ثم يتوسع.
قائمة مراجعة
- سياسة Report-Only مختبرة.
- inline scripts تستخدم nonce/hash.
- لا يوجد wildcard غير مبرر.
- frame-ancestors مضبوطة.
- object-src مقيدة.
- تقارير الانتهاك لا تسجل بيانات حساسة بلا حاجة.
احذر من بناء السياسة من المدخلات
لا تضع domain أو nonce مأخوذة من user input داخل CSP. السياسة نفسها جزء أمني ويجب أن تُبنى من configuration موثوقة. كذلك لا تنقل nonce إلى أماكن يمكن لمهاجم قراءة قيمتها بسهولة ثم حقن Script تحملها.
اختبر XSS كجزء من Regression
بعد تفعيل CSP، اختبر pages التي تحتوي Markdown أو rich text أو search أو query parameters و widgets. الهدف أن تتأكد أن التشفير الأساسي ما زال صحيحًا وأن CSP تمنع تنفيذ payloads الاختبارية عند وجود خطأ. لا تعتبر غياب console errors دليلًا كافيًا.
شارك في تقييم ونقاش المقال
رأيك يضيف قيمة للمقال ويساعدنا على تحسين المحتوى والنقاش حوله.
النقاش
جارٍ تحميل التعليقات…