ماهي سياسة أمان المحتوى Content Security Policy (CSP)؟
سياسة أمان المحتوى - Content Security Policy (CSP) هو معيار أمان للكمبيوتر قدمه اتحاد شبكة الويب العالمية (W3C) لمنع هجمات البرمجيات الخبيثة والضارة عبر المواقع (XSS) وهجمات النقر. لتوضيحها ببساطة ، سياسة أمان المحتوى عبارة عن قائمة بيضاء لأصول المحتوى المسموح بتحميله أو تنفيذه على صفحة ويب. سنلقي نظرة على الإصدارات الثلاثة من CSP والميزات ذات الصلة لكل منها ، على الرغم من أنه من المهم ملاحظة أن المستوى 3 لـ سياسة أمان المحتوى لم يتم التصديق عليه بعد كتوصية W3C ولا يزال مسودة عمل قيد التقدم. لا يزال عرضة للتغيير من وقت لآخر قبل إعتماده. و سيتم توضيح الاختلافات بين هذه الإصدارات لك في هذا المقال.
ما هي البرمجة النصية عبر المواقع - Cross-Site Scripting (XSS)؟
تعد هجمات البرمجة النصية عبر المواقع (XSS) نوعًا من حقن التعليمات البرمجية، حيث يتم حقن البرمجيات النصية الخبيثة و الضارة في مواقع الويب الموثوقة. فيمكن أن يحدث مثال لذلك في مواقع التجارة الإلكترونية: حيث يقوم المشتري بنشر مراجعة للمنتج مع كود برمجي ضار يتم حفظه على الخادم. وعندما يقوم كل عميل بمشاهدة مراجعة المنتج ، يتم تنفيذ تعليمات برمجية ضارة على جهازه.
تشغيل سياسة أمان المحتوى - Content Security Policy ؟
يمكن تحديد سياسة أمان المحتوى - Content Security Policy في الترويسة (HTTP response header). عندما يطلب عميل ويب ، مثل مستعرض الويب ، موردًا من خادم الويب ، فإنه يرسل طلب HTTP مع مجموعة من المعلومات في ترويسة الطلب للخادم. إذا نجح الطلب ، يقوم خادم الويب بالرد مرة أخرى مع المورد مع رأس استجابة يخبر متصفح الويب بكيفية التعامل مع الاستجابة. في حالة سياسة أمان المحتوى ، يتم تحديد المصادر الموثوقة لجلب محتوى صفحة الويب منه. في المتصفحات القادرة على التعامل مع النسخة الثانية من سياسة أمان المحتوى (CSP 2) ، لدينا خيار إضافي لتحديد CSP في علامة HTML الوصفية (HTML meta tag). بالنسبة للأمثلة ، هذا بالضبط ما سنستخدمه؛ نحن نتبع نهجًا حياديًا لإطار عمل الويب لإبقاء الأمور بسيطة. كل ما تحتاجه لتطبيق وتنفيذ الأمثلة هو محرر نصوص ومتصفح ويب حديث.
تحليل سياسة أمان المحتوى
سياسة أمان المحتوى تبدأ بـ Content-Security-Policy ، والذي يتبعه توجيه واحد أو أكثر. ينتهي كل توجيه بفاصلة منقوطة ، والتي يمكن أن تكون بداية التوجيه التالي. يمكن أن يحتوي كل توجيه على قيم صفرية أو قيم متعددة. القيم مفصولة بمسافة فارغة. في أغلب الأحيان ، تكون القيمة هي ببساطة عنوان URL لمصدر موثوق.
Content-Security-Policy [directive] <value>;
هذا مثال لتوجيه واحد لسياسة أمان المحتوى. والذي يخبر المتصفح بالوضوق بروابط src الافتراضية ذو القيمة "الذاتية" فقط أي بالمحتوى من نفس أصل صفحة الويب.
Content-Security-Policy default-src 'self';
يتم عرض CSP المكافئ في علامة وصفية أدناه:
<meta http-equiv="Content-Security-Policy" content="default-src 'self';>
لاحظ أنه يجب تحديد العلامة الوصفية داخل ترويسة الموقع أي بين الوسمين <head>...</head> ، وليس في جسم <body> النص الأساسي في HTML. أحد الجوانب السلبية الكبيرة التي يجب على المطور توخي الحذر منها: باستخدام نهج العلامات الوصفية ، لا يتم فرض قواعد سياسة أمان المحتوى CSP حتى تتم قراءة العلامة الوصفية ومعالجتها.
يمكنك أيضا قراءة: ما هي خدمة الموجز - RSS ؟ دليلك لكل مايجب عليك معرفته حول RSS.
مثال: هذا هو كود HTML الذي يقوم بتحميل الصورة من CodeProject بدون CSP. يمكنك نسخ الرمز ولصقه في ملف HTML فارغ وحفظه محليًا.
<html>
<head>
<title>CSP
in Action</title>
<head>
<body>
<p><img
src="https://www.codeproject.com/App_Themes/CodeProject/Img/logo250x135.gif"
/> </p>
</body>
</html>
الآن قم بفتح الملف HTML على المستعرض بالنقر المزدوج فوق الملف الموجود، حيث سيتم تنزيل الصورة وعرضها من CodeProject.
الآن دعونا نقوم بإضافة علامة وصفية سياسة أمان المحتوى لنفس ملف HTML الذي قمنا بعمله كما هو في الكود التالي، ومن ثم فتح الملف لمعرفة الإختلاف: :
<html>
<head>
<meta http-equiv="Content-Security-Policy" content="default-src 'self';">
<title>CSP
in Action</title>
<head>
<body>
<p><img
src="https://www.codeproject.com/App_Themes/CodeProject/Img/logo250x135.gif"
/> </p>
</body>
</html>
يوووم! كما هو ظاهر لن يتم عرض الصورة وستظهر علامة عدم وجود الصورة للإشارة إلى
أن الصورة لم يتم جلبها لأن www.codeproject.com ليس في نفس المجال الأصلي. اضغط
على F12 على متصفح الويب لفتح أدوات المطور وانتقل إلى علامة تبويب وحدة التحكم.
على Chrome ، حيث يظهر هذا الخطأ باللون الأحمر. وستظهر الرسالة التالية: " رفض
تحميل الصورة.
"https://www.codeproject.com/App_Themes/CodeProject/Img/logo250x135.gif" لأنها
تنتهك توجيه سياسة أمان المحتوى التالي: default-src" self
.
لاحظ أنه لم يتم تعيين "img-src" بشكل صريح، لذلك يتم استخدام "default-src" كإجراء احتياطي. ما فعلناه بشكل فعال مع التوجيه الافتراضي src هو تقييد كل المحتوى على نفس الأصل باستخدام الكلمة الرئيسية "self" ، كما هو موضح سابقًا. دعونا نلحق default-src بمسافة فارغة ويتبعها رابط CodeProject. للتبسيط ، سأقوم فقط بعرض العلامة الوصفية المحدثة حيث سيظل بقية HTML دون تغيير.
<meta http-equiv="Content-Security-Policy" content="default-src 'self'
https://www.codeproject.com;">
افتح الصفحة مرة أخرى. الآن سيتم عرض صورة CodeProject. ملاحظة: الكلمة الأساسية الذاتية يجب أن تكون محاطة بعلامات اقتباس مفردة بينما مع الروابط غير مطلوب.
عرض HTML في المتصفح. الآن عادت الصورة. نظرًا لأن gif عبارة عن مورد للصور ، فلنقم ببعض إعادة البناء ونضع CodeProject URI تحت التوجيه img-src.
<meta http-equiv="Content-Security-Policy" content="default-src 'self';
img-src
https://www.codeproject.com;">
اعرض الصفحة على المتصفح مرة أخرى. لا تزال الصورة تظهر. في الفقرة السابقة، لم يتم تحديد img-src ومع ذلك ظهرت الصورة أيضا. فما هي قيمة إضافة img-src إذن؟ الجواب ، عندما لا يتم تحديده ، فإنه يرث من الافتراضي src. ملاحظة: إذا كان عنوان URL الخاص بك يعيد التوجيه إلى رايط على مجال آخر ، فيجب أن يكون هذا النطاق في العلامة الوصفية لسياسة أمان المحتوى CSP أيضًا.
توجيهات سياسة أمان المحتوى Content Security Policy
تغطي توجيهات سياسة أمان المحتوى Content Security Policy في الغالب نوع المحتوى الذي يمكن تحديد مصدره (مصادره). تغطي هذه المقالة معظم التوجيهات. حيث يتم عرض جميع التوجيهات التي تعود إلى src الافتراضية في التسلسل الهرمي أدناه.
default-src: هو العامل الرئيسي لتوجيهات الجلب الأخرى عندما لا يتم تحديدها صراحة.
child-src: يسرد المصادر الموثوقة للعاملين على الويب وسياقات التصفح المتداخلة التي تم تحميلها باستخدام عناصر مثل <frame> و <iframe>. تم إهمال هذا التوجيه في CSP 3. بدلاً من child-src ، ولإدراج المصدر الموثوق به لسياقات التصفح المتداخلة والعاملين ، يجب استخدام توجيهات frame-src و worker-src على التوالي.
script-src: يحدد المصادر الموثوقة لجافا سكريبت
object-src: يحدد المصادر الموثوقة لعناصر <object> و <embed> و <applet>
style-src: يحدد المصادر الموثوقة لأوراق الأنماط (CSS)
img-src: يحدد المصادر الموثوقة للصور والأشكال المفضلة
media-src: يحدد المصادر الموثوقة لتحميل الوسائط باستخدام عناصر <audio> و <video> و <track>
frame-src: يحدد المصادر الموثوقة لسياقات التصفح المتداخلة التي يتم تحميلها باستخدام عناصر مثل <frame> و <iframe>
font-src: يحدد المصادر الموثوقة للخطوط المحملة باستخدام @ font-face
connect-src: يحد من عناوين URL التي يمكن تحميلها باستخدام واجهات البرنامج النصي. تتضمن واجهات البرنامج النصي <a> ping و Fetch و XMLHttpRequest و WebSocket و EventSource
worker-src: يحدد المصادر الموثوقة للنصوص Worker أو SharedWorker أو ServiceWorker
base-url: يحدد من عناوين الروابط التي يمكن استخدامها في عنصر <base> في المستند
plugin-types: تحد من مجموعة المكونات الإضافية التي يمكن تضمينها في مستند عن طريق الحد من أنواع الموارد التي يمكن تحميلها. على سبيل المثال ، للسماح ببرنامج Flash ، حدد نوع Mime الخاص به: application / x-shockwave-flash في هذا التوجيه
sandbox: ضع المورد تحت وضع حماية مشابه لسمة وضع الحماية <iframe>.
form-action: يحد من عناوين URL التي يمكن استخدامها كهدف لعمليات إرسال النموذج من سياق معين
frame-ancestors: يحد من المصادر الذين يمكنهم تضمين صفحة باستخدام <frame> أو <iframe> أو <object> أو <embed> أو <applet>
report-url: قائمة الروابط لمتصفح الويب للإبلاغ عن انتهاك سياسة أمان المحتوى. تتكون تقارير الانتهاك هذه من مستندات JSON المرسلة عبر طلب HTTP POST إلى URI المحدد. تم إيقافه في CSP 3 ، لكنه لا يزال مدعومًا على نطاق واسع
report-to: report-uri (المذكور أعلاه) تمت إعادة تسميته إلى report-to و report-uri تم إهماله في CSP 3. ومع ذلك ، في وقت كتابة المقالة ، لا يدعم مستعرض واحد الإبلاغ إلى. من الجيد تمامًا تحديد كلٍّ من تقرير uri وتقرير إلى CSP المحقق في المستقبل
block-all-mixed-content: يحظر تحميل أي أصول باستخدام HTTP عند تحميل الصفحة باستخدام HTTPS
upgrade-insecure-requests: يوجه متصفح الويب للتعامل مع جميع عناوين URL غير الآمنة الخاصة بالموقع (تلك التي يتم عرضها عبر HTTP) كما لو تم استبدالها بعناوين URL آمنة (تلك التي يتم عرضها عبر HTTPS). هذا التوجيه مخصص لمواقع الويب التي تحتوي على عدد كبير من عناوين URL القديمة غير الآمنة والتي تحتاج إلى إعادة كتابتها.
require-sri-for: يتطلب استخدام Subresource Integrity (SRI) للنصوص أو الأنماط الخارجية على الصفحة.
قيم سياسة أمان المحتوى CSP Values
يتبع كل توجيه قيمة واحدة أو أكثر مفصولة بمسافة بيضاء. تنقسم أنواع القيم المقبولة إلى فئتين رئيسيتين: الكلمات الرئيسية و URL.
يجب وضع كل الكلمات الرئيسية ، باستثناء أحرف البدل ، بين علامتي اقتباس مفردتين:
'self': قصر المصدر على نفس الموقع.
‘none’: لا يوجد مصدر مسموح به.
*: wildcard
‘unsafe-inline’: تسمح بجافا سكريبت المضمن و أنماط CSS
‘unsafe-eval’: يسمح بجافا سكريبت ديناميكي من خلال Eval ()
أحد الأسباب الشائعة جدًا لتحديد عنوان URL للمصدر الخارجي الموثوق به بخلاف نفس الأصل هو الحاجة إلى دعم مورد التحميل من شبكة توصيل المحتوى (CDN) ، وهي شبكة موزعة جغرافيًا من الخوادم الوكيلة التي تخزن المحتوى الذي يتم تنزيله بشكل شائع.
يجب عدم وضع عناوين URL داخل علامات اقتباس مفردة!
في سياسة أمان المحتوى Content Security Policy الإصدار الأول، يُسمح فقط بالمخطط (http أو https) والمجال ورقم المنفذ في URL.
https://example.com:80/
بينما في سياسة أمان المحتوى Content Security Policy الإصدار الثاني، يُسمح بالمجالات الفرعية والمسارات. يسمح URL هذا بجميع الملفات الموجودة في مجلد js:
https://example.com:80/js/
يتعامل URL هذا مع js كملف وليس كمجلد ، لأنه لا ينتهي بشرطة مائلة للأمام:
https://example.com:80/js
للسماح لجميع المجالات الفرعية للموقع، استخدم علامة النجمة كحرف بدل.
https: // *. example.com:80/
الخلاصة
في هذا المقال ، تعرفنا على سياسة أمان المحتوى Content Security Policy و رأينا كيفية استخدام العلامات الوصفية لسياسة أمان المحتوى CSP جيدًا لتقييد مصدر الموارد والقضاء على إمكانية تشغيل / عرض محتويات غير موثوق بها. وككلمة تحذير ، يجب على المطور توخي أقصى درجات الحذر والتعامل بدقة وحرص شديد عند إستخدام علامات الوصفية لسياسة الأمان لضمان عدم إغفال أي من المصادر التي تحتاجها صفحة الويب والذي قد يتسبب بحذفها من خلال العلامات الوصفية لسياسة أمان المحتوى CSP، مما يتسبب في تعطل وظائف الموقع، وحرمان المستخدم من الإستفادة منها.