یک عدد برنامه نویس دات نت .علاقه مند به تکنولوژی های روز. جوون و پر از انگیزه :) همینا برای شناختم کافی نیست؟!
hsts چیست؟
فرض کنید که به یک رستوران رفتید و قصد دارید از wifi رایگان آنجا استفاده کنید. دقت کردید که رمز wifi با یک برگه به دیوار چسبیده و هر کسی بخواد می تونه از اون استفاده کنه ؟
ممکنه همزمان با شما ، یک هکر هم داخل همون رستوران باشه. خب مشخصا اون هکر میتونه تمام اتصالات نا امن رو به سادگی شنود کنه. هکر می تونه تمام ترافیک های شبکه ای که از پروتکل http استفاده می کنن برای هر سایتی و فقط متکی به ریدایرکت کردن کاربر از http به https هستند رو شنود کنه. خب ، اگر دقت کنیم موقعی که این اتفاق می افته دگ اصلا ssl بی معنی میشه و دیتا های ما کاملا در دست هکر هست.
این دلیلیه که ما صرفا به ریدایرکت کردن کاربر از http به https بسنده نکنیم و به سراغ چیز دیگه ای بنام hsts بیایم.
(البته خود این تبدیل http به https هم زمان بر هست که با HSTS برطرف میشه)
سوال اول. HSTS چیه؟
کلمه HSTS مخفف http strict transport security هست. HSTS یک هدر واکنشی هست که به مرورگر اطلاع میده که وب سایت های فعال شده فقط از طریق HTTPS قابل دسترسی هستند. بعد از فعال شدن HSTS بر روی سایت ، مرورگر مجبور می شود تا فقط به نسخه https دسترسی داشته باشد.
سوال دوم.HSTS چگونه کار می کند؟
وقتی ما یک آدرس سایت رو در مرورگرمون می زنیم ، عموما Schema اون رو وارد نمیکنیم. در این حالت بصورت پیش فرض ، http در نظر گرفته میشه و یک درخواست http به سرور ارسال می شه. سرور اون درخواست رو ریدایرکت میکنه (استاتوس کد 301) به https . و پس از اون، مجددا مرورگر یک ریکوست به سرور میده ولی این بار بصورت https . در این مرحله ، HSTS یک هدر روی response ای که به کاربر برگردوند قرار میده.
Strict-Transport-Security: max-age=31536000; includeSubDomains
این هدر تعداد دستور العمل به مرورگر ما میده. یکی از اون ها max-age هست به این معنی که از الان ، تا زمانی که اون تایم تموم بشه (یک سال) هر ریکوستی که به سایت مرورگر بخواد بده ، باید روی https باشه. اگر ریکوستی با پروتکل http به مرورگر بیاد ، مرورگر خودش اون رو جایگزین میکنه با https . برای اینکه این موضوع روی ساب دامین ها هم اعمال بشه ، دستورالعمل includeSubDomains هم در هدر قرار میگیره.
سوال سوم. آیا HSTS کاملا امن هست؟
متاسفانه بار اولی که به وبسایت دسترسی میگیریم ، از HSTS استفاده نمیشه. اگر وب سایت بیاد و هدر HSTS رو به ریکوست http که براش اومده ، اتصال بده ، اون هدر نادیده گرفته میشه چون هکر میتونه خیلی راحت اون هدر رو پاک کنه یا دستکاری کنه (بدلیل http بودن ). بطور کلی هدر HSTS قابل اعتماد نیست مگر زمانی که از HTTPS استفاده بشه.
نکته دگ اینکه هر بار که مرورگر هدر مربوط به HSTS رو ببینه max-age رفرش میشه و maximum اون هم دو سال هست.
اگر max-age رو برابر 0 بزاریم ، مرورگر از ریکوست های بعدی اینطوری در نظر میگیره که این سایت یک سایت جدید هست و میتونه ریکوست http بهش بده.
چجوری از HSTS داخل ASP.Net Core استفاده کنیم؟
خب توی مرحله اول ، باید توی متد ConfigureService ، کد زیر رو بنویسیم.
services.AddHsts(opts => {
opts.MaxAge = TimeSpan.FromDays(1);
opts.IncludeSubDomains = true;
});
توی بخش configuration چند تا پراپرتی وجود داره که می تونیم ست کنیم (در اصل همون دستور العمل هایی هستن که توی هدر ست میشن و به مرورگر داده میشن).
یکیش max-age هست که خب قبلا دربارش صحبت کردیم. اگر مقداری براش ست نکنیم ، مقدار پیش فرضش 30 روز هست.
بعدی IncludeSubDomains هست که باز هم قبلا دربراش صحبت شد. اگر ست نشه پیشفرضش false هست .
مورد بعدی ExcludeHosts هست که اون هاست هایی که هدر hsts نباید ست بشه براشون رو مشخص میکنه. بصورت پیش فرض داخلش localhost و 127.0.0.1 و [1::] هست یعنی برای هیچ کدوم از اینها هدر hsts ست نمیشه . میتونیم خودمون هم هر هاستی که بخوایم رو اضافه کنیم.
حالا میریم سراغ متد configure .
طبق همین pipeline ای که مایکروسافت در داکیومنتش قرار داده رفتار می کنیم.
(الان محل بحث ما فقط https و HSTS هست).
اول میدلویر HSTS اضافه میشه و بعد از اون میدلویر مربوط به ریدایرکت به https. فقط نکته ای که وجود داره اینه که نیاز نیست HSTS رو برای بخش development قرار بدید (اصلا کار هم نمیکنه چون بصورت پیشفرض سر لوکال هاست و ... که بالاتر گفتم کار نمیکنه و اون هدر مربوطه رو ست نمیکنه).
فقط برای production قرارش بدید.
میدلویر مربوط به HSTS اسمش UseHsts هست و میدلویر مربوط به ریدایرکت از http به https ، اسمش UseHttpsRedirection هست.
موفق باشید.
✅مقالات بیشتر در دات نت زوم
مطلبی دیگر از این انتشارات
آموزش Cache در Asp.Net Core (قسمت دوم : EasyCaching)
مطلبی دیگر از این انتشارات
اگه هنوز براتون سواله که MongoDb یا مثلا SqlServer ...
مطلبی دیگر از این انتشارات
اشتباهات رایج در استفاده از Async/Await + راه حل