HSTS من غير ما توقع الموقع: الـ rollout الآمن لـ Strict-Transport-Security

الـ redirect لـ HTTPS مش كفاية. إزاي تفعّل HSTS على مراحل من غير ما تقفل الموقع على المستخدمين، حسب توثيق MDN.

موقعك عامل redirect من HTTP لـ HTTPS وفاكر إنك كده خلصت؟ المشكلة إن أول request من المستخدم لسه ممكن يروح على HTTP عادي قبل ما الـ redirect يحصل، وده بالظبط الباب اللي الـ header اللي اسمه Strict-Transport-Security (أو HSTS) بيقفله. بس لو اتعمل غلط، ممكن يقفل الموقع نفسه على المستخدمين. تعالى نشوف إزاي نعمله صح، والكلام كله من توثيق MDN.

الـ HSTS بيعمل إيه بالظبط؟

الـ header ده بيقول للمتصفح: «الموقع ده يتفتح على HTTPS بس». وبعد ما المتصفح يستلمه، حسب MDN:

  • التحويل بيحصل في المتصفح: أي لينك http للموقع بيتحوّل لـ https قبل ما الـ request يتبعت أصلًا
  • مفيش click-through: لو فيه مشكلة في الشهادة (زي شهادة invalid)، المتصفح مش هيدي المستخدم أي طريقة يكمّل بيها
  • بالدومين بس: الـ host بيتعرف باسم الدومين، والـ IP address ميقدرش يبقى HSTS host
  • كل الـ ports: الـ HSTS بيطبق على كل الـ ports بتاعة الـ host مهما كان الـ port اللي اتعمل عليه الـ request

شكل الـ header:

Strict-Transport-Security: max-age=<expire-time>; includeSubDomains; preload
  • max-age: المدة بالثواني اللي المتصفح يفتكر فيها إن الموقع HTTPS بس
  • includeSubDomains: اختياري، والسياسة بتطبق على كل الـ subdomains كمان
  • preload: اختياري، ولو استخدمته لازم max-age يبقى 31536000 على الأقل (سنة) ومعاه includeSubDomains

الـ rollout الآمن على مراحل

  1. ابدأ بمدة صغيرة. مثلًا 5 دقايق بس، علشان لو فيه حاجة باظت تخلص بسرعة:
Strict-Transport-Security: max-age=300
  1. ابعته على HTTPS بس. MDN بتقول إن الـ host لازم يبعت الـ header على HTTPS، والمتصفح بيتجاهله لو جه على HTTP.

  2. زوّد المدة وضيف includeSubDomains. بس بعد ما تتأكد إن كل subdomain شغال HTTPS:

Strict-Transport-Security: max-age=31536000; includeSubDomains
  1. الـ preload آخر خطوة. محتاج max-age سنة على الأقل و includeSubDomains، واقرا شروط hstspreload.org كويس قبل ما تقدّم.

حاجتين ناس كتير بتقع فيهم

  • المدة بتتجدد: كل response فيه الـ header بيحدّث وقت الانتهاء. يعني max-age ثابت معناه إن السياسة مش هتخلص طول ما الناس بتزور الموقع.
  • الإلغاء مش فوري: علشان تلغي HSTS تبعت max-age=0، بس ده مش هيشتغل غير لما المتصفح يعمل request على HTTPS ويستلم الرد. يعني مينفعش تلغيه من HTTP.

اعمل إيه دلوقتي

  1. افتح DevTools، تاب Network، وشوف الـ response headers بتاعة موقعك: فيه Strict-Transport-Security؟ أو من الـ terminal:
curl -sI https://example.com | grep -i strict-transport-security
  1. اعمل قايمة بكل الـ subdomains قبل ما تحط includeSubDomains: الـ staging القديم، الـ mail panel، أي حاجة نسيتها.
  2. ابدأ بمدة صغيرة وزوّدها على مراحل، وراقب لو حد اشتكى.

رأيي

الـ HSTS من أرخص حاجات الأمان اللي ممكن تعملها: header واحد. بس includeSubDomains مع subdomain قديم مش شغال HTTPS ممكن يقفله على كل المستخدمين لحد ما المدة تخلص، ومفيش زرار «كمّل برضه». فالصبر في الـ rollout أهم من الـ header نفسه.

المصادر

  • WebSecurity
  • HTTPS
  • HSTS
  • WebDev
  • Full Stack Tips