التخفيف من هجمات XSS باستخدام سياسة أمان المحتوى

:bookmark: يشرح هذا الدليل كيفية استخدام سياسة أمان المحتوى (CSP) للتخفيف من هجمات تنفيذ السكريبت عبر المواقع (XSS) في Discourse. يتناول أساسيات CSP، والإعداد، وأفضل الممارسات.

:person_raising_hand: مستوى المستخدم المطلوب: مدير النظام

الملخص

تُعد سياسة أمان المحتوى (CSP) ميزة أمنية حاسمة في Discourse تساعد في الحماية من هجمات تنفيذ السكريبت عبر المواقع (XSS) وأنواع أخرى من هجمات الحقن. يغطي هذا الدليل أساسيات CSP، وكيفية تطبيقها في Discourse، وكيفية تكوينها لموقعك.

ما هي سياسة أمان المحتوى؟

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

لا يزال XSS أحد أكثر ثغرات الويب شيوعًا. من خلال تطبيق CSP، يسمح Discourse بتحميل وتنفيذ السكريبتات من المصادر الموثوقة فقط، مما يقلل بشكل كبير من خطر هجمات XSS.

تطبيق CSP في Discourse

بدءًا من إصدار Discourse 3.3.0.beta1، يطبق Discourse سياسة CSP تعتمد على ‘strict-dynamic’. تستخدم هذه الطريقة قيمة nonce- واحدة وكلمة strict-dynamic في توجيه script-src. يتم منح جميع وسوم \u003cscript\u003e الأولية في النواة والقوالب سمة nonce= المناسبة تلقائيًا.

تشمل السياسة الافتراضية التوجيهات التالية:

  • script-src: يحدد المصادر الصالحة لملفات JavaScript
  • worker-src: يحدد المصادر الصالحة لسكريبتات ServiceWorker
  • object-src: يمنع تنفيذ الإضافات (Flash، Java، إلخ)
  • base-uri: يقيد عناوين URL لعناصر \u003cbase\u003e
  • manifest-src: يقيد عناوين URL لملفات تعريف تطبيقات الويب
  • frame-ancestors: يتحكم في المواقع التي يمكنها تضمين مثيل Discourse الخاص بك داخل إطار iframe
  • upgrade-insecure-requests: يرقّي تلقائيًا طلبات HTTP إلى HTTPS (يُدرج عند تمكين force_https)

تكوين CSP في Discourse

الإعدادات المتاحة

  • content_security_policy: يفعّل أو يعطّل CSP (الافتراضي: مفعل)
  • content_security_policy_report_only: يفعّل وضع تقرير CSP فقط (الافتراضي: معطل)
  • content_security_policy_script_src: يتيح لك توسيع توجيه script-src الافتراضي
  • content_security_policy_frame_ancestors: يفعّل توجيه frame_ancestors (الافتراضي: مفعل)

كيفية تفعيل CSP

  1. انتقل إلى لوحة الإدارة (Admin panel)
  2. اذهب إلى إعدادات الأمان (Security settings)
  3. ابحث عن إعداد content_security_policy وتأكد من أنه مفعل

يُنصح بالبدء بوضع تقرير CSP فقط (Report-Only mode) لتحديد أي مشاكل محتملة قبل تفعيل CSP بالكامل:

  1. فعّل إعداد content_security_policy_report_only
  2. راقب وحدة تحكم المتصفح (browser console) بحثًا عن انتهاكات CSP
  3. تعامل مع أي انتهاكات مشروعة عن طريق توسيع CSP حسب الحاجة
  4. بمجرد التأكد من عدم وجود نتائج إيجابية كاذبة، قم بإيقاف وضع التقرير فقط وقم بتفعيل CSP بالكامل

توسيع CSP الافتراضي

إذا كنت بحاجة إلى السماح بمصادر سكريبت إضافية، يمكنك توسيع توجيه script-src باستخدام إعداد content_security_policy_script_src. يمكنك إضافة:

  • مصادر التجزئة (Hash-sources)
  • 'wasm-unsafe-eval'
  • 'unsafe-eval' (استخدم بحذر)

على سبيل المثال:

'sha256-QFlnYO2Ll+rgFRKkUmtyRublBc7KFNsbzF7BzoCqjgA=' 'unsafe-eval'

:warning: كن حذرًا عند إضافة 'unsafe-eval' أو أي توجيهات متساهلة أخرى، حيث يمكن أن تقلل من فعالية CSP.

CSP ودمج الطرف الثالث

عند استخدام خدمات طرف ثالث مثل Google Tag Manager أو Google Analytics أو خدمات الإعلان، قد تحتاج إلى تعديل إعدادات CSP الخاصة بك. في معظم الحالات مع إصدار Discourse 3.3.0.beta1 أو الأحدث، يجب أن تعمل السكريبتات الخارجية دون حاجة إلى تكوين إضافي بفضل تطبيق CSP ‘strict-dynamic’.

إذا واجهت مشاكل، قد تحتاج إلى:

  1. تحديد مصادر السكريبت المطلوبة عن طريق مراقبة وحدة تحكم المتصفح
  2. إضافة المصادر الضرورية إلى إعداد content_security_policy_script_src
  3. بالنسبة للدمج المعقد مثل خدمات الإعلانات التي تحمّل موارد خارجية، قد تحتاج إلى تمكين العرض عبر النطاقات (cross-domain rendering) (مثال على طلب سحب من discourse-adplugin يقوم بذلك).

أفضل الممارسات

  1. ابدأ بوضع تقرير CSP فقط لتحديد المشاكل المحتملة
  2. ضيق نطاق CSP تدريجيًا أثناء حل الانتهاكات المشروعة
  3. راجع إعدادات CSP بانتظام وعدّلها حسب الحاجة
  4. كن حذرًا عند إضافة توجيهات متساهلة مثل 'unsafe-eval' أو 'wasm-unsafe-eval'
  5. حافظ على تحديث مثيل Discourse للاستفادة من آخر تحسينات CSP

الأسئلة الشائعة (FAQs)

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

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

س: كيف يمكنني استكشاف مشاكل CSP وإصلاحها؟
ج: استخدم أدوات المطورين في متصفحك لمراقبة وحدة التحكم بحثًا عن رسائل انتهاك CSP. ستساعدك هذه في تحديد الموارد التي يتم حظرها ولماذا.

موارد إضافية

56 إعجابًا
Adsense Not Working after Recent Discourse Update
Discourse 2.2.0.beta6 Release Notes
Adding statcounter code
How to restart Discourse after server reboot?
How to install npm packages in custom themes/plugins
Interactive SVG using <object>?
Video Upload to YouTube and Vimeo using Theme Component
Embed HTML5 player for MP3 file
2.5.0.beta5 breaks retort plugin
Should I load third-party libraries from vendor or cdn?
Word Cloud plugin
Embed widget within text in a topic
Discourse Intercom (Advanced)
"Unsafe JavaScript attempt to initiate navigation"
Google Tag Manager and Discourse CSP (Content Security Policy)
Cookie Consent, GDPR, and Discourse
A strange question about google ad display in my site
How to pass a component setting as a value to an attribute?
Need help integrating code wrote on Edittext to the Discourse
Issue with Activate Account Page After Update to 3.4.0 (Blank Page)
Any approved method for adding Javascript before body close?
(Superseded) Experimenting with a 'strict-dynamic' Content Security Policy (CSP)
Can't get script tag to work in landing pages plugin due to content-security-policy
How to embed Razorpay subscription button with CSP restrictions
Push custom events to Google Tag Manager and Analytics
Can I add a snippet to the header?
JS script is not loading
How do we fire scripts after topic HTML is rendered in DOM?
Iframe issue without URL
Where to place ad script?
We couldn't find the code on your site
Javascript not working in customised areas
Difficulties in correctly adding external JavaScript
Report Only CSP Violations
Nginx config in Discourse Docker?
EPN Smart Links
Discourse 2.2.0.beta9 Release Notes
"Refused to load the script" when adding adsense
Why Cookie Consent Doesn't Show Up?
[DigitalOcean] hostname having "www" in A records showing blank page
[DigitalOcean] hostname having "www" in A records showing blank page
Communities with embedded Twitter Feeds
How to add analytics and pixel scripts avoiding Content Security Policy (XSS)
When install html script facing issue?
Discourse 2.4.0.beta10 Release Notes
Add CSP sources to the plugin
IP does not redirect to domain, domain shows white page
DISCOURSE_CDN_URL causes content security policy violations?
Header content is missing due to CSP
How to insert something right after <head>?
How can I embed tracking JS into Discourse
How do I integrate ? cookiebot.com in meinen Forum?
Adding Cookie Consent Banner
Confused about remotely loaded javascript content
User input validation
Custom JS script in theme component not loading