فاحص ترويسات HTTP الأمنية

ما تفعله كل ترويسة، وما تقوله ترويستك فعليًا، والسطر الذي ينقصك. بلا تقييم بالحروف.

من أين تبدأ إن كنت في البداية

الترويسات ليست متساوية القيمة ولا متساوية الخطورة عند النشر. وهذا ترتيبها بما يعطي أكبر حماية بأقل احتمال لكسر شيء:

الترويسةتمنعخطر كسر الأشياء
Strict-Transport-Securityخفض HTTPS عند الزيارة الأولىلا خطر، إن كنت تقدّم عبر HTTPS فقط أصلاً
X-Content-Type-Optionsتخمين نوع الملفات المرفوعةلا خطر عملياً
Referrer-Policyتسريب الروابط إلى أطراف ثالثةمنخفض — قد يؤثر في إسناد التحليلات
X-Frame-Options / frame-ancestorsاختطاف النقرمنخفض، إلا إن كان شيء ما يضمّنك بحق
Permissions-Policyطلب الإطارات المضمَّنة للكاميرا أو الموقعمنخفض
Content-Security-Policyتنفيذ الشيفرة المحقونةمرتفع. استعمل وضع الإبلاغ فقط أولاً.

والسطر الأخير هو الأهم وهو الوحيد الذي يتطلب عملاً حقيقياً. أما كل ما فوقه فأصيلٌ واحد يكفيه.

‏HSTS، والقرار الوحيد غير القابل للرجوع فيه

تخبر Strict-Transport-Security المتصفح باستعمال HTTPS لهذا المضيف طوال الثواني التالية المحددة في max-age، مهما كان. وهي تسدّ ثغرة ضيقة لكنها حقيقية: فالزائر الذي يكتب example.com يرسل طلباً واحداً بلا تشفير قبل إعادة توجيهك، وذلك الطلب قابل للاعتراض.

Strict-Transport-Security: max-age=31536000; includeSubDomains

وincludeSubDomains أهم مما تبدو. فبدونها يظل نطاق فرعي يُقدَّم عبر HTTP قادراً على ضبط كعكات للنطاق الأب. ومعها يجب أن يكون كل نطاق فرعي عبر HTTPS فقط وإلا صار غير قابل للوصول — فتحقّق قبل إضافتها.

أما التوجيه preload فهو القرار الذي يستحق تفكيراً عميقاً. فهو يُدرِج نطاقك داخل قوائم التحميل المسبق التي تُشحن مع المتصفحات، فيُفرَض HTTPS قبل أن يقع الطلب الأول أصلاً. وهو أيضاً غير قابل للرجوع عملياً: إذ تتطلب الإزالة طلباً إلى القائمين على القائمة ثم انتظار انتشار إصدارات المتصفحات، وذلك شهور. وهو ممتاز متى تيقّنت؛ وسيّئ أن يُضاف على عجل.

‏CSP: وضع الإبلاغ فقط ليس اختيارياً

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

انشرها في وضع الإبلاغ فقط مع جهة تجميع، واتركها أسابيع من حركة حقيقية. وما ستجده ليس ما توقعته من قراءة الشيفرة — فسيظهر مضيف خطوط نسيته، وإطار دفع مضمَّن، وكثيراً ما تظهر شيفرة محقونة عند حافة شبكة توصيل المحتوى لا وجود لها في أي ملف مصدري. وتلك الفئة الأخيرة هي بالضبط ما وُجد وضع الإبلاغ ليكشفه.

Content-Security-Policy-Report-Only: default-src 'self';
  script-src 'self'; object-src 'none'; base-uri 'self';
  report-uri /csp-report

وثمة أمران يبطلان معظم الفائدة. فـ 'unsafe-inline' في script-src يسمح بالضبط بالشيفرة السطرية المحقونة التي وُجدت السياسة لمنعها — والمخرج هو أرقام العبور مرة واحدة أو البصمات. و'unsafe-eval' يعيد تمكين eval وأخواتها، وبعض إصدارات أطر العمل الأقدم ما زالت تحتاجها. والفاحص يؤشّر على الاثنين بوصفهما إضعافاً لا غياباً، لأن السياسة معهما ما زالت تؤدي عملاً مفيداً؛ لكنها لا تؤدي المهمة الأساسية.

ترويسات انتهت صلاحية النصائح بشأنها

  • `X-XSS-Protection` — كان يتحكم في مرشّح داخل المتصفح أُزيل من كل المتصفحات الكبرى، وكان في زمنه قابلاً للتلاعب به لكسر الصفحات. وهي ليست ترويسة تُضبط في 2026.
  • `Expect-CT` — متقادمة. فشفافية الشهادات تُفرَض الآن دون شرط، فلا تفعل الترويسة شيئاً.
  • `Feature-Policy` — أُعيدت تسميتها Permissions-Policy بصياغة مختلفة. ولا يُعتَدّ إلا بالاسم الجديد.
  • `Public-Key-Pins` — أُزيلت من المتصفحات، وأُحسن صنعاً. فخطأ واحد فيها كان يعطّل نطاقك طوال مدة التثبيت بلا سبيل إلى التعافي.

ما لا تفحصه هذه الأداة

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

أما لإعداد TLS تحديداً فإن Qualys SSL Labs هي الأداة الراسخة وهي شاملة. وأما الشهادة نفسها فتقرأ هذه الأداة ما يقدّمه المضيف فعلاً.

أسئلة حول الترويسات

لماذا لا توجد درجة أو تقدير؟

لأن التقدير هو تحديداً المخرج الذي لا يستطيع أحد التصرف بناءً عليه. فمعرفتك أن تقديرك «C» لا تخبرك أي ترويسة ناقصة، ولا لماذا تهمّ موقعك، ولا ماذا تضبط — بل تغري بإضافة ترويسات لرفع حرف بدل حل مشكلة. فموقع بسياسة محتوى صارمة وبلا Permissions-Policy في حال أفضل بكثير من موقع ضبط ست ترويسات على قيم متساهلة، ولا حرف واحد يعبّر عن ذلك. لذا تُبلَّغ هنا كل ترويسة على حدة، وتُقيَّم القيمة التي ترسلها فعلاً، ويُعطى لك السطر الذي تضيفه.

أي ترويسة أضيف أولاً؟

‏Strict-Transport-Security، إن كنت أصلاً تقدّم عبر HTTPS فقط. فهي سطر واحد، ولا يمكن أن تكسر شيئاً كان يعمل، وتغلق ثغرة الخفض عند الزيارة الأولى. ثم Content-Security-Policy في وضع الإبلاغ فقط — فهي صاحبة الأنياب الحقيقية، ووضع الإبلاغ يتيح لك اكتشاف ما يحمّله موقعك فعلاً قبل أن تفرض شيئاً. كذلك X-Content-Type-Options: nosniff لا يكلّف شيئاً وينبغي أن يكون مفعّلاً وحسب.

هل ستكسر سياسة أمن المحتوى موقعي؟

قد تكسره بسهولة، ولهذا وُجد وضع الإبلاغ فقط. انشر Content-Security-Policy-Report-Only مع جهة تجميع، واتركه أسبوعين من حركة حقيقية، ثم اقرأ ما يبلّغ عنه — ستجد موارد كنت قد نسيتها، وكثيراً ما تجد أشياء تحقنها شبكة توصيل محتوى أو مزوّد تحليلات عند الحافة ولا تظهر في أي ملف مصدري. ولا تفرض السياسة إلا بعد أن تهدأ التقارير. أما فرض سياسة كُتبت من قراءة الشيفرة فهو الطريق المعتاد لإسقاط صفحة الدفع.

هل يستحق X-XSS-Protection الضبط؟

لا. فقد كان يتحكم في مرشّح XSS داخل المتصفح أُزيل من كل المتصفحات الكبرى — أسقطه كروم سنة 2019 — بل إن المرشّح نفسه في زمنه أدخل ثغرات، إذ كان يمكن التلاعب به ليكسر صفحات غير مصابة أصلاً. وضبطه على 0 له وجه إن أصرّ عليه فاحص ما؛ أما ضبطه على 1; mode=block فتكرار لنصيحة انتهت صلاحيتها قبل سنوات. والبديل هو Content-Security-Policy.

هل ما زلت أحتاج X-Frame-Options وعندي CSP؟

لا، شريطة أن تضبط سياستك frame-ancestors، فهي تَجُبّه في كل متصفح حديث. وهذا الفاحص يدرك ذلك فلا يبلّغ عن غياب X-Frame-Options حين تكون frame-ancestors تؤدي المهمة. والإبقاء عليهما معاً لا يكلّف شيئاً ولا يفيد إلا مع متصفحات بلغت من القدم حداً يجعل لديك على الأرجح مشكلات أكبر.

هل غياب ترويسة يعني أنني مصاب بثغرة؟

لا. فترويسات الأمان دفاع في العمق — تحدّ من ضرر الثغرة ولا تُنشئها ولا تزيلها. فالموقع الخالي من سياسة محتوى ليس مصاباً بثغرة XSS؛ المصاب هو موقع فيه خلل XSS، وسياسة المحتوى هي ما يمنع ذلك الخلل من التحول إلى اختراق كامل. وإضافة الترويسات مجدية ورخيصة، لكنها ليست بديلاً عن ترميز المخرجات والتحقق من المدخلات وإبقاء الاعتماديات محدَّثة.

آخر مراجعة . وجدت شيئاً لم يعد محدَّثاً؟ أخبِرنا.