ما هو HSTS؟
يعني HSTS أمان النقل الصارم عبر HTTP. وهو ترويسة استجابة واحدة اسمها Strict-Transport-Security. تقول للمتصفح: لهذا الموقع استخدم HTTPS فقط من الآن.
بعد أن يرى المتصفح الترويسة، يحوّل كل رابط http:// إلى https:// قبل أن يرسل أي شيء. كما يمنع الزائر من تجاوز تحذير الشهادة. ونتيجة لذلك لا يستطيع أحد إعادة هذا الزائر خفية إلى HTTP.
الثغرة التي يغلقها HSTS
تعيد معظم المواقع توجيه HTTP إلى HTTPS. هذا جيد، لكنه يترك ثغرة. فالطلب الأول ما زال يخرج عبر HTTP العادي، وبعده فقط يرد الخادم بإعادة التوجيه.
على شبكة Wi-Fi عامة يكون هذا الطلب الأول هو اللحظة الضعيفة. فقد يرد مهاجم على الشبكة نفسها أولًا ويُبقي الزائر على نسخة HTTP مزيفة من موقعك. وتسمى هذه الحيلة SSL stripping.
يزيل HSTS هذه اللحظة في كل زيارة بعد الأولى. فلأن المتصفح يعرف القاعدة مسبقًا، لا يرسل طلب HTTP أبدًا. وإضافة إلى ذلك تختفي قفزة إعادة التوجيه، فتفتح الصفحة أسرع قليلًا.
كيف تضيف HSTS في htaccess
أولًا، تأكد أن كل صفحات موقعك تعمل عبر HTTPS، بما فيها الصور والسكربتات والنطاقات الفرعية التي تستخدمها. ثم أضف سطرًا واحدًا إلى ملف .htaccess على Apache:
Header always set Strict-Transport-Security "max-age=300" ابدأ بقيمة max-age قصيرة قدرها 300 ثانية أثناء الاختبار. فإذا تعطل شيء، تنسى المتصفحات القاعدة خلال خمس دقائق. وعلى Nginx يوضع السطر نفسه في كتلة خادم HTTPS:
add_header Strict-Transport-Security "max-age=300" always; 
بعد ذلك افحص النتيجة باستخدام فاحص ترويسات HTTP المجاني. فهو يبيّن إن كانت الترويسة تصل وما قيمة max-age فيها.
كيف ترفع max-age بأمان
تشغيل HSTS سهل، لكن إيقافه بطيء. فالمتصفح يحتفظ بالقاعدة طوال مدة max-age حتى لو حذفت الترويسة. لذلك ارفعها على مراحل:
- 300 ثانية (خمس دقائق) أثناء الاختبار.
- 86400 ثانية (يوم) عندما لا يتعطل شيء.
- 604800 ثانية (أسبوع) بعد أيام هادئة.
- 31536000 ثانية (سنة) عندما تعمل كل الصفحات عبر HTTPS منذ فترة.
السنة هي القيمة التي توصي بها معظم الأدلة للموقع المنشور. وهي أيضًا الحد الأدنى لقائمة التحميل المسبق.
includeSubDomains وpreload
يطبّق الخيار includeSubDomains القاعدة على كل نطاق فرعي أيضًا. أضفه فقط عندما تعمل كل النطاقات الفرعية عبر HTTPS، حتى القديمة منها مثل أداة داخلية أو لوحة بريد.
أما الخيار preload فيذهب خطوة أبعد. فالمتصفحات تحمل قائمة مدمجة بمواقع HSTS، لذلك حتى الزيارة الأولى تستخدم HTTPS. لكن الخروج من هذه القائمة يستغرق شهورًا. لذا أرسل نطاقك إلى hstspreload.org فقط عندما تكون متأكدًا.
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" كيف تقرأ ترويسة HSTS
للترويسة ثلاثة أجزاء على الأكثر. وكل جزء منها وعد تقطعه لكل متصفح يزورك.
max-age
هو عدد الثواني التي يحتفظ فيها المتصفح بالقاعدة. ويبدأ المؤقت من جديد في كل زيارة تُرسل فيها الترويسة. لذلك لا يصل الزائر المعتاد إلى نهايته فعلًا.
includeSubDomains
يغطي هذا الخيار كل اسم تحت نطاقك، مثل shop.example.com وmail.example.com. ولهذا يتوقف نطاق فرعي منسي بلا HTTPS عن العمل لكل من رأى القاعدة.
preload
يقول هذا الخيار فقط إنك توافق على إضافتك إلى قائمة المتصفحات المدمجة. وهو وحده لا يفعل شيئًا. لذلك ما زال عليك إرسال النطاق.
من أين يجب أن تأتي الترويسة
لا تقبل المتصفحات الترويسة إلا عبر اتصال HTTPS صالح. كما يجب للتحميل المسبق أن يرسلها النطاق بدون www، لا www فقط.
HSTS على خوادم وشبكات CDN أخرى
الفكرة واحدة في كل مكان: إرسال ترويسة في كل استجابة HTTPS. ولهذا يتغير فقط المكان الذي تكتبها فيه.
Cloudflare
في لوحة Cloudflare افتح SSL/TLS ثم Edge Certificates، وفعّل HSTS. واختر هناك قيمة max-age. ولأن Cloudflare يرسل الترويسة بنفسه، لا تحتاج سطرًا إضافيًا في htaccess.
ووردبريس
إذا لم تستطع تعديل الخادم، يمكن لإضافة أمان أن تضيف الترويسة. لكن قاعدة الخادم أسرع، لأنها تعمل حتى قبل أن يبدأ PHP.
IIS
على خوادم ويندوز أضف ترويسة مخصصة باسم Strict-Transport-Security في ترويسات استجابة HTTP للموقع. ثم افحصها باستخدام فاحص الترويسات.
كيف تختبر HSTS وتزيله
أولًا، اختبر من الخارج باستخدام فاحص ترويسات HTTP. فهو يعرض الترويسة وقيمة max-age التي يستلمها الزوار بالضبط.
في Chrome يمكنك أيضًا فتح chrome://net-internals/#hsts والاستعلام عن نطاقك. فيعرض إن كان المتصفح قد حفظ القاعدة ومتى تنتهي. وفي الصفحة نفسها يمكنك حذف القاعدة من متصفحك أثناء الاختبار.
لإزالة HSTS للجميع، أرسل max-age=0 لفترة بدل حذف الترويسة. ثم ينسى كل متصفح يزورك القاعدة. بعد ذلك يمكنك حذف السطر.
أخطاء شائعة
- البدء بقيمة max-age لسنة. فإذا تعطل HTTPS يبقى الزوار ممنوعين حتى تنتهي السنة.
- إضافة includeSubDomains بينما ما زال نطاق فرعي بلا شهادة.
- إرسال الترويسة عبر HTTP. فالمتصفحات تتجاهلها هناك، ولا تُحتسب إلا عبر HTTPS.
- نسيان الكلمة
always، فتخرج صفحات الخطأ بلا ترويسة. - إرسال النطاق إلى قائمة التحميل المسبق للتجربة.
باختصار، HSTS سطر واحد، لكن max-age وعد. ارفعه ببطء وافحص كل خطوة باستخدام فاحص ترويسات HTTP. ولشرح كل توجيه بالتفصيل راجع دليل MDN عن Strict-Transport-Security.
أسئلة وأجوبة
ماذا يفعل HSTS؟
يخبر المتصفح أن يستخدم HTTPS فقط لموقعك لمدة محددة. وبعد الزيارة الأولى لا يرسل المتصفح أي طلب HTTP عادي إلى موقعك.
هل ما زلت أحتاج إعادة التوجيه من HTTP إلى HTTPS مع HSTS؟
نعم. فإعادة التوجيه تغطي الزيارة الأولى قبل أن يرى المتصفح الترويسة، ويغطي HSTS كل زيارة بعدها.
ما قيمة max-age المناسبة لـ HSTS؟
ابدأ بـ 300 ثانية أثناء الاختبار، ثم ارفعها على مراحل. وللموقع المنشور تكون 31536000 ثانية (سنة) هي القيمة النهائية المعتادة.
كيف أزيل HSTS؟
أرسل الترويسة مع max-age=0. فتحذف المتصفحات القاعدة في الزيارة التالية عبر HTTPS، وحتى ذلك الحين تحتفظ بالقاعدة القديمة.
هل HSTS مفيد للسيو؟
ليس بشكل مباشر. لكنه يزيل قفزة إعادة توجيه للزوار العائدين ويحميهم، وهذا يساعد السرعة والثقة.
لماذا لا تظهر ترويسة HSTS عندي؟
تأكد أنها تُرسل عبر HTTPS، وأن وحدة headers في Apache مفعّلة، وأن شبكة CDN أو ذاكرة مؤقتة لا تحذفها. ويعرض فاحص ترويسات HTTP ما يصل فعلًا.
ما هو التحميل المسبق لـ HSTS؟
قائمة مدمجة في المتصفحات حتى تستخدم الزيارة الأولى HTTPS. تحتاج max-age لسنة وincludeSubDomains وpreload، ثم ترسل النطاق إلى hstspreload.org.
هل يمكن أن يمنع HSTS الزوار؟
نعم، إذا تعطل HTTPS بينما قيمة max-age طويلة مفعّلة. لهذا تبدأ بقيمة قصيرة ولا ترفعها إلا عندما يعمل كل شيء.
هل يبطئ HSTS موقعي؟
لا. فهو يزيل إعادة التوجيه من HTTP إلى HTTPS للزوار العائدين، لذلك تفتح الصفحات أسرع قليلًا.
أين أفعّل HSTS في Cloudflare؟
في SSL/TLS ثم Edge Certificates تحت HTTP Strict Transport Security. وبذلك لا تحتاج إضافته في htaccess أيضًا.
هل يمكنني إضافة HSTS بإضافة ووردبريس؟
نعم، كثير من إضافات الأمان ترسله. لكن قاعدة في htaccess أو Nginx أسرع وتغطي أيضًا الملفات خارج ووردبريس.
لماذا تُرسل ترويسة HSTS مرتين؟
لأن الخادم وشبكة CDN أو إضافة يضيفانها في الوقت نفسه. أبقِ مصدرًا واحدًا حتى تكون قيمة max-age واضحة.
كيف أعرف إن كان Chrome قد حفظ قاعدة HSTS؟
افتح chrome://net-internals/#hsts واستعلم عن نطاقك. ويمكنك أيضًا حذف القاعدة من متصفحك هناك.
هل يعمل HSTS على localhost؟
تتجاهل المتصفحات HSTS على localhost وعناوين IP، لذلك يُختبر على نطاق حقيقي.
ماذا يحدث إذا انتهت الشهادة وHSTS مفعّل؟
لا يستطيع الزوار الذين رأوا القاعدة تجاوز التحذير. ولهذا يصبح التجديد التلقائي للشهادة أهم مع HSTS.
هل HSTS مثل إعادة التوجيه 301؟
لا. فإعادة التوجيه يرسلها الخادم مع كل طلب HTTP. أما HSTS فيجعل المتصفح يتخطى طلب HTTP تمامًا.
هل يجب أن تستخدم كل النطاقات الفرعية HTTPS قبل includeSubDomains؟
نعم. افحص كل نطاق فرعي، حتى القديم منها والأدوات الداخلية، قبل إضافة الخيار.
كم يستغرق دخول قائمة التحميل المسبق؟
عادة من أسابيع إلى شهور، لأن القائمة تصل مع إصدارات المتصفحات الجديدة.
هل يحمي HSTS من كل الهجمات؟
لا. فهو يمنع الرجوع إلى HTTP العادي. لذلك تحتاج ترويسات أخرى مثل Content-Security-Policy للمخاطر الأخرى.
هل يفحص مدقق السيو HSTS؟
نعم. يعرض مدقق السيو لدينا إن كانت الترويسة تُرسل، ويقودك إلى هذا الدليل عندما تكون مفقودة.