الخلاصة

  • اقترحت أول مسودة علنية لسياسة أمن المحتوى نشرها W3C في 29 نوفمبر 2011 أن يعلن الموقع مصادر موارده، وأن يفحص المتصفح طلبات التحميل الفعلية وفق تلك القائمة.
  • وصفت توصية المستوى الثاني الصادرة في 15 ديسمبر 2016 سياسة نافذة وأخرى للرصد وإرسال التقارير، مع قيم عشوائية وبصمات تسمح بتحديد نصوص برمجية داخل الصفحة. الموقع يكتب القائمة والمتصفح يقف عند الباب.

أقام الموقع حفلة ثم أضاع دفتر الدعوات. جاء نص برمجي من مورّد مألوف، وآخر من إضافة قديمة لم يعد أحد يتذكر سبب تثبيتها. اصطفّت الصور والخطوط، ولحقت بها اتصالات قادمة من عناوين بعيدة. وسط الزحام حاولت شيفرة دخيلة أن تبدو كأنها من أهل المكان. تعيين حارس باب فكرة سهلة. المشكلة أن صاحب الحفل كان عليه أن يسلمه قائمة تصلح للعمل.

وضعت أول مسودة عمل علنية لسياسة أمن المحتوى نشرها W3C في 29 نوفمبر 2011 هذا التوزيع للعمل. وصفت الوثيقة سياسة تصريحية تحدد من أين يمكن لتطبيق الويب تحميل موارده، سعياً إلى تقليل أخطار حقن المحتوى، ومنها النصوص البرمجية العابرة للمواقع. يحدد الموقع مصادر يقبلها، ثم يقارن المتصفح طلب المورد الفعلي بتلك القواعد قبل السماح بتحميله.

لم تكن القائمة ختم «موثوق» واحداً يوضع على كل شيء. فرّقت المسودة بين default-src وقواعد للبرامج والصور والتنسيقات والخطوط والإطارات والوسائط والاتصالات. يستطيع الموقع قبول صور من أماكن عدة مع تضييق أماكن الشيفرة القابلة للتنفيذ. صورة معلقة على الجدار وشخص يتحكم بإضاءة المسرح لا يحتاجان المفتاح نفسه. أعطت السياسة لكل نوع من الموارد باباً يناسب عمله.

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

قدمت توصية W3C للمستوى الثاني من سياسة أمن المحتوى في 15 ديسمبر 2016 بروفة قبل بدء المنع. يطلب ترويس Content-Security-Policy-Report-Only من المتصفح مراقبة ما يخالف سياسة مقترحة وإرسال تقارير، مع استمرار تحميل الموارد. وتعرض الوثيقة طريقة تطوير القائمة بهذه المراقبة قبل الانتقال إلى ترويس Content-Security-Policy الذي يفرضها. يقف الحارس أولاً بدفتر ملاحظات، ثم يمد الحبل عند الباب بعد أن يتعرف إلى الواصلين.

يمكن للتقارير أن تكشف تاريخ الموقع الذي نسيه أصحابه: خطاً مطلوباً من عنوان خارج القائمة، أداة قياس بقيت في صفحة قديمة، أو اتصالاً يطلقه مكوّن بلا مسؤول واضح. يسجل المتصفح ما رآه. ويقرر فريق الموقع إن كان المورد جزءاً مقصوداً من الخدمة، أو إن كان ينبغي حذفه أو تعديل الصفحة أو القاعدة. وضع التقارير يضع الفرق بين الموقع المرسوم على السبورة والموقع الذي يعمل فعلاً أمام أعين المشغلين.

حتى موضع كتابة السياسة أحدث فرقاً. فضّلت توصية 2016 ترويسة استجابة HTTP التي تصل إلى المتصفح في بداية معالجة الصفحة. وسمحت أيضاً بسياسة داخل عنصر meta في موضع مبكر من HTML؛ لكن هذه القاعدة لا تعود إلى موارد حُمّلت قبل ظهورها ولا تحمل وضع التقارير وحده. تعليق التعليمات داخل القاعة بعد عبور نصف الجمهور لا ينظم المدخل. الترويسة تصل مع فتح الباب.

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

وللمبنى أكثر من مدخل. تتناول img-src الصور، وconnect-src اتصالات معينة، وbase-uri العنوان الأساسي للروابط النسبية، وform-action وجهات النماذج، وframe-ancestors الصفحات التي يجوز لها احتواء الموقع داخل إطار. كل قاعدة تصف نشاطاً يستطيع المتصفح ملاحظته. يقرر الموقع حدود النشاط، ويتحقق المتصفح منها وقت حدوثه.

يسجل تاريخ نشر CSP Level 2 لدى W3C مراحل المسودات التي سبقت توصية ديسمبر 2016. هذه تواريخ وثائق معيارية. أما التغير الباقي فكان في توزيع المسؤوليات: يعلن الموقع من يريد استقباله، يفحص المتصفح الموارد عند التحميل، وتكشف التقارير مقدار اختلاف الصفحة الحقيقية عن القائمة. حصل الحارس على تعليمات أوضح، واضطر المضيف إلى التعرف إلى حفله.

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