الهندسة البرمجية

ترويسات أمان HTTP: ما تفعله كل ترويسة أمنية في الواقع

ست ترويسات تحجب فئات كاملة من الهجمات الإلكترونية، مرتبة حسب الأولوية — وظيفة كل منها، ومخاطر التطبيق الخاطئ، وترويستان يجب التوقف عن إرسالهما.

تعد ترويسات الأمان (Security Headers) أرخص وسيلة متاحة لتحصين وتأمين أي موقع إلكتروني. فكل ترويسة منها تتطلب مجرد سطر واحد في إعدادات الخادم، ولا تكلف أي تأخير في سرعة الأداء، وتعمل معاً على حجب فئات كاملة من الهجمات الإلكترونية الشائعة.

ومع ذلك، فإن أغلب المواقع لا ترسل أياً منها على الإطلاق.

إليك ما تفعله كل ترويسة بدقة، مرتبة حسب أولويات تطبيقها الآمن، إلى جانب ترويستين ينبغي لك حذفهما فوراً.

ابدأ من هنا: الترويسات الثلاث التي يستحيل أن تعطل أي شيء

هذه الترويسات آمنة تماماً لإضافتها اليوم لأي موقع ويب في جلسة عمل واحدة دون أدنى مخاطرة.

1. ترويسة X-Content-Type-Options: nosniff

X-Content-Type-Options: nosniff

قيمة واحدة، بلا إعدادات معقدة، ودون أي عيوب أو أضرار جانبية.

بدونها، تقوم المتصفحات بـ \"استشعار\" نوع المحتوى (MIME Sniffing) وقد تقرر أن نوع الملف الفعلي يختلف عن النوع المعلن عنه. وهذه هي الثغرة التي تُنفذ بها الهجمات الخبيثة عندما يرفع مستخدم ملفاً — أُعلن عنه كصورة عادية — فيقوم المتصفح بتشغيله ككود JavaScript تنفيذي لأن محتواه يشبه السكربتات البرمجية.

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

2. ترويسة X-Frame-Options

X-Frame-Options: SAMEORIGIN

تمنع تضمين صفحاتك داخل إطار iframe في موقع خارجي لشخص آخر. وتلك هي الطريقة المعتمدة في هجمات اختطاف النقرات (Clickjacking): حيث يقوم موقع المهاجم بتحميل صفحتك داخل إطار شفاف مخفي يضعه بدقة فوق زر خادع، فتنقر الضحية على واجهتك وموقعك بدلاً من الزر المعروض أمامه.

تسمح القيمة SAMEORIGIN لموقعك بتضمين صفحاته داخل نفسه فقط، وهو ما تحتاجه عادة. بينما تمنع القيمة DENY أي تضمين داخل الإطارات نهائياً.

والبديل الأحدث والأكثر مرونة هو خاصية frame-ancestors ضمن سياسة CSP. وإرسال كلتيهما معاً لا يكلف شيئاً ويضمن حماية المتصفحات القديمة.

3. ترويسة Referrer-Policy

Referrer-Policy: strict-origin-when-cross-origin

تتحكم في مقدار ما يُرسل من رابط صفحتك الحالية عند نقر الزائر على رابط ينتقل به إلى موقع خارجي آخر.

فبدون هذه الترويسة، يتسرب الرابط بالكامل — بما في ذلك أي بيانات أو معرّفات مدرجة في استعلامات البحث (Query Strings). وكم من رموز استعادة كلمات المرور، ومعرفات الجلسات، وعمليات البحث الداخلية، وأرقام العملاء تسربت بهذه الطريقة إلى أطراف ثالثة ينقر المستخدم على روابطها.

ترسل القيمة strict-origin-when-cross-origin الرابط كاملاً عند التنقل داخل صفحات موقعك، وترسل اسم النطاق فقط للمواقع الخارجية التي تدعم HTTPS، ولا ترسل أي شيء إطلاقاً عند النزول لاتصال HTTP غير آمن. وأصبحت هذه القيمة هي الخيار الافتراضي للمتصفحات الحديثة، لكن إرسالها صراحة يحمي المتصفحات القديمة ويوثق التزامك الأمني.

الخطوة التالية: ترويسة HSTS

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

تخبر المتصفح بوجوب الاتصال بهذا النطاق حصراً عبر بروتوكول HTTPS طوال المدة المحددة، دون محاولة فتح اتصال HTTP عادي أولاً.

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

طبقها بتدرج وحذر. ترويسة HSTS هي التزام صارم تفرضه المتصفحات ولا يمكنك التراجع عنه سريعاً. فإذا حددت مدة max-age لعام كامل مع خاصية includeSubDomains ثم اكتشفت لاحقاً نطاقاً فرعياً داخلياً يعمل عبر HTTP فقط، فسيصبح ذلك النطاق الفرعي غير متاح إطلاقاً لكل من زار موقعك — ولمدة عام كامل.

المسار الآمن للتطبيق:

  1. تأكد من أن كل نطاق فرعي يعمل عبر HTTPS بشكل صحيح تماماً.
  2. انشر الترويسة بقيمة max-age=300 لبضعة أيام للمراقبة.
  3. ارفع القيمة إلى max-age=86400 (يوم واحد) لمدة أسبوع.
  4. ثم اعتمد القيمة الكاملة max-age=31536000; includeSubDomains (عام كامل).

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

الترويسة الأقوى والأهم: سياسة أمان المحتوى (CSP)

تحدد سياسة Content-Security-Policy المصادر المصرح للصفحة بتحميل السكربتات والتنسيقات والصور والخطوط والاتصالات منها. وعند ضبطها بالشكل الصحيح، فإنها تجهض معظم هجمات البرمجة النصية عبر المواقع (XSS) حتى لو نجح المخترق في حقن الكود — فالسكربت المحقون يفتقر لمصدر مصرح به، فيرفض المتصفح تشغيله فوراً.

وهي أيضاً الترويسة الوحيدة في هذه القائمة القادرة على تعطيل موقعك إن ضبطت خطأ، ولهذا تندر رؤيتها في المواقع العادية.

Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; frame-ancestors 'self'; base-uri 'self'; form-action 'self'

معضلة السكربتات المضمنة unsafe-inline. تحتوي أغلب المواقع على كتل <script> مضمنة داخل صفحاتها — مثل أدوات التحليلات، وبرامج إدارة الوسوم، والأكواد التفاعلية البسيطة. والسياسة الصارمة لـ CSP تحظرها جميعاً. وإضافة 'unsafe-inline' إلى تعليمة script-src تجعل السياسة تعمل بلا أخطاء لكنها تجردها من معظم قيمتها الأمنية، لأن السكربتات المضمنة هي تحديداً ما وُجدت سياسة CSP لحجبه.

والحل الجذري يكمن في استخدام أرقام الأمان العشوائية (Nonces) أو التجزئة (Hashes): عبر توليد رقم أمان عشوائي فريد عند كل طلب، ووضعه في سكربتاتك الشرعية، والإشارة إليه في نص السياسة. يتطلب هذا تصييراً من جانب الخادم للرقم العشوائي، ولهذا يتطلب جهداً برمجياً يفوق مجرد سطر إعدادات بسيط.

انشر السياسة في وضع التقارير أولاً (Report-Only):

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

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

أربع تعليمات بسيطة وذات قيمة عالية حتى في السياسات المرنة: تعليمة frame-ancestors (ضد اختطاف النقرات)، و base-uri (تمنع وسوم <base> المحقونة من إعادة توجيه الروابط النسبية)، و form-action (تمنع النماذج المحقونة من إرسال البيانات لمواقع خارجية)، و object-src 'none' (تقضي على ثغرات إضافات حقبة Flash القديمة).

ترويسة Permissions-Policy

Permissions-Policy: geolocation=(), microphone=(), camera=(), payment=()

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

ترويستان يجب عليك حذفهما والتوقف عن إرسالهما

ترويسة X-XSS-Protection أصبحت قديمة وغير صالحة. كانت تفعل فلتراً أمنياً تم حذفه رسمياً من متصفحي Chrome و Edge نظراً لتسببه في ثغرات أمنية خاصة به. وإرسالها اليوم عديم الجدوى، ووجودها يشير إلى إعدادات نُسخت من شروحات قديمة كُتبت قبل عقد من الزمان.

ترويستا Server و X-Powered-By المتضمنتان لأرقام الإصدارات تفضحان نوع وإصدار برمجياتك بالضبط. وعند الإعلان عن أي ثغرة أمنية جديدة، تنطلق روبوتات الفحص الشامل للبحث عن هذه الترويسات تحديداً. احجبهما وأخفهما تماماً:

Header unset X-Powered-By
Header unset Server
ServerTokens Prod

إعدادات خوادم Apache و LiteSpeed

يغطي هذا معظم الاستضافات المشتركة، بما فيها Hostinger. ضع هذه الأسطر في ملف .htaccess:

<IfModule mod_headers.c>
  Header always set X-Content-Type-Options "nosniff"
  Header always set X-Frame-Options "SAMEORIGIN"
  Header always set Referrer-Policy "strict-origin-when-cross-origin"
  Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()"
  Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" env=HTTPS
  Header unset X-Powered-By
</IfModule>

كلمة always مهمة جداً — فبدونها تُحذف الترويسات من استجابات صفحات الخطأ، وهو الوقت الذي تحتاج فيه للحماية أكثر من غيره.

وعلى خوادم Nginx، يكون المكافئ استخدام تعليمة add_header … always; داخل كتلة server.

التحقق والفحص العملي

يمكنك فحص ترويسات الاستجابة الحية لأي موقع باستخدام أداة فحص ترويسات الأمان HTTP المجانية. تقرأ الأداة الترويسات الفعلية التي يرجعها خادمك، وتقيم مستوى الأمان، وتنبهك للقيم الضعيفة مع ذكر السبب الدقيق — فسياسة CSP التي تحتوي على unsafe-inline تُقيم بنتيجة تختلف تماماً عن السياسة النقية الخالية منها.

أولويات التطبيق بالترتيب

  1. X-Content-Type-Options — سطر واحد دون أي مخاطرة.
  2. X-Frame-Options — سطر واحد دون أي مخاطرة.
  3. Referrer-Policy — سطر واحد دون أي مخاطرة.
  4. حذف X-XSS-Protection وترويسات كشف إصدارات الخادم.
  5. Permissions-Policy — حظر الميزات غير المستخدمة.
  6. HSTS — تطبيق تدريجي مدروس.
  7. CSP — وضع كتابة التقارير أولاً، ثم فرض الحماية.

الخطوات من 1 إلى 5 تُنجز في جلسة عمل واحدة وتعديل سريع. والخطوتان 6 و 7 تتطلبان تأنياً ومتابعة. وتطبيق الخطوات الخمس الأولى بمفردها يضع موقعك في مستوى حماية يتفوق على معظم مواقع شبكة الويب اليوم.

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

فتح الأداة ترويسات الأمان تعرف على ترويسات أمان HTTP التي يرسلها موقعك — وما هي تدابير الحماية المفقودة لديك.

متابعة القراءة

أخبرونا بما ترغبون في تنميته وتطويره.

فريق واحد. ثلاثة مكاتب. أينما كنت، تحصل على إجابة من خبير أول — لا على نص مبيعات.

عرض سعر مكتوب خلال يوم عمل واحد، بلغتكم.