در صورتی که داده ها محافظت نشوند، می توان از تمام ارتباطات بین وب سایت شما و مرورگر کاربر سوء استفاده کرد. مهاجمان می توانند به این تبادلات گوش دهند و حتی ارتباطات بین مشتری و سرور را دستکاری کنند. به این کار استراق سمع یا حمله مرد میانی (Man in the middle attacks) گفته می شود. شنود شبکه همچنین می تواند منجر به ربودن جلسه/نشست ربایی (Session Hijacking) شود. اگر در یک کافیشاپ از اتصال Wi-Fi عمومی استفاده کنید و وارد یک وبسایت شوید، چه اتفاقی ممکن است رخ دهد؟ این کار، اطلاعات ورود به سیستم و جلسه(Session) شما را ذخیره می کند.
یک مزاحم/مهاجم می تواند جلسه را ربوده و تمام کارهایی را که می توانید در حساب کاربری خود انجام دهید انجام دهد. برای جلوگیری از این حملات، باید از یک اتصال امن استفاده کنیم که عبور و مرور اطلاعات در بستر اینترنت را رمزگذاری می کند. Secure Sockets Layer یا SSL پروتکلی است که برای این منظور استفاده می شود. طرح کلی HTTPS از HTTP استفاده می کند، اما لایه رمزگذاری SSL را اضافه می کند. بسیار مهم است که سایت های محافظت شده با رمز عبور، از SSL استفاده کنند تا رمز عبور از طریق یک کانال ناامن ارسال نشود. هر درخواست پس از ورود باید به استفاده از SSL ادامه دهد.
همچنین باید مطمئن شوید که تمام اطلاعات با ارزش وب سایت شما ایمن هستند. به عنوان مثال، تصاویر، استایل شیت ها و اسکریپت ها همه باید از طریق HTTPS بارگیری شوند. اگر مراقب نباشید، در نهایت با محتوای مختلط درهم ریخته مواجه خواهید شد. بدین معنی که، زمانی این اتفاق رخ می دهد که HTML از طریق HTTPS بارگیری می شود، اما منابع دیگر از HTTP ناامن استفاده می کنند. مرورگرهای مدرن در صورت وجود محتوای مختلط در هم ریخته، هشدارهایی را به کاربران نشان می دهند. فقط وب سایت هایی با اطلاعات حساس نیستند که باید محافظت شوند. استفاده از HTTPS به چند دلیل برای همه وب سایت ها توصیه می شود. حتی تعامل با صفحات عمومی می تواند اطلاعات مربوط به رفتار و هویت کاربران را افشا کند. HTTPS در حال تبدیل شدن به یک نیاز برای ویژگیهای مدرن و یکپارچگی نرم افزار ها است. گوگل نیز برای استفاده از HTTPS در همه جای وب سایت ها، اطلاع رسانی کرده و فراخوان داده است.
یک تصور اشتباه این است که استفاده از HTTPS ممکن است بر عملکرد وب سایت تأثیر بگذارد و سرعت وب سایت را کاهش دهد، اما این مشکلی برای CPU های سریع امروزی ایجاد نمی کند.
اکنون، بیایید نحوه اجرای SSL در ASP.net core را بررسی کنیم. یک ویژگی خاص به نام RequireHttps وجود دارد که می توانید آن را برای کنترلرها یا متد ها (اکشن ها) اعمال کنید. بیایید آن را به کنترلر Accounts اضافه کنیم.
[RequireHttps]
public class AccountController : Controller
{
این کار از گذرواژههای حساسی که در حین ورود به سایت به سمت کنترلر ارسال میشوند محافظت میکند و الان همه متد ها در کنترلر Accounts به SSL نیاز دارند. نقطه ضعف انجام این کار این است که استفاده از این روش مستعد خطا است، یک توسعه دهنده وب ممکن است فراموش کند که ویژگی RequireHttps را به یک کنترلر جدید اضافه کند.
یک رویکرد بهتر این است که ویژگی را به سطح کل برنامه برای همه درخواست ها اعمال کنید. کلاس startup را باز کنید و به سراغ متد ConfigureServices بروید. در اینجا، قبل از اینکه MVC را رجیستر کنیم، می توانیم گزینه های مختلفی را تعریف کنیم. اینجاست که ما یک فیلتر نیاز به HTTPS را در سطح کل برنامه ثبت می کنیم. متد configure را فراخوانی کنید و MvcOptions را به متد پاس کنید. ما باید فضای نام Microsoft.AspNetCore.Mvc را در بالای کلاس وارد کنیم. و بعد، بیایید گزینه های خود را تعریف کنیم.
ما یک فیلتر جدید به مجموعه فیلترهای مربوط به گزینه ها اضافه می کنیم، و این گزینه RequireHttpsAttribute می باشد.
services.Configure
(options =>
{
options.Filters.Add(new RequireHttpsAttribute());
});
اگر برنامه را در محیط توسعه اجرا میکنید، میتوانید از If برای پرش از این مرحله استفاده کنید، یا میتوانید IIS Express را در ویژوال استودیو تنظیم کنید تا تحت SSL اجرا شود، بنابراین این کار محیط تولید را نیز شبیه سازی میکند.
بیایید این کار را با باز کردن properties مربوطه به پروژه و کلیک بر روی تب debug انجام دهیم.
چک باکس فعال کردن SSL را علامت بزنید و مطمئن شوید که یک آدرس به صورت HTTPS در اینجا ایجاد می شود. با استفاده از لینک Copy، آدرس URL ایجاد شده را کپی می کنیم. حالا پروژه خود را ذخیره کرده و پروژه RouxAcademy را راه اندازی و اجرا کنیم.
توجه داشته باشید که سایت هنوز درست نمایش داده نمی شود. ویژگی RequireHttpsAttribute که اضافه کرده بودیم، به طور خودکار سایت را به HTTPS هدایت می کند، اما عدد پورت ، شماره درستی نیست. بیایید URL امنی را که کپی کردیم جایگزین کنیم. و اکنون، سایت کار می کند.
گواهی SSL تولید شده توسط ویژوال استودیو قابل اعتماد نیست، بنابراین مرورگر ممکن است یک هشدار ایجاد کند. می توانید با پذیرفتن اعتماد موقت به گواهی، از آن عبور کنید. به خاطر داشته باشید که سایت MVC ما همچنین دارای فایل های استاتیکی است که هنوز می توانم از طریق HTTP به آنها دسترسی داشته باشم. ویژگی RequireHttpsAttribute روی فایل استاتیک اعمال نمی شود. به عنوان مثال، من می توانم صفحه HTML برنامه را از طریق HTTP مشاهده کنم. ادامه دهید و این کار را با مشاهده صفحه programs/programs.htm انجام دهید.
ما میتوانیم با استفاده از میانافزار URL rewriting با هدایت همه درخواستهای HTTP به HTTPS، این مشکل را برطرف کنیم. ابتدا باید بسته NuGet به نام Rewrite را اضافه کنیم.
Microsoft.ASPNetCore.Rewrite را جستجو کنید. آن را در پروژه RouxAcademy نصب کنید.
و حالا بیایید به کلاس Startup.cs ، به سراع متد Configure برویم.
در اواسط متد در جای مناسب، یک شیء RewriteOptions ایجاد می کنیم. و متد AddRedirectToHttps را از آن فراخوانی می کنیم و سپس باید این شیء ایجاد شده را به روال های متد Configure اضافه کنیم برای این کار از متد UseRewriter درون شیء app استفاده می کنیم و شیء ایجاد شده RewriteOptions را به آن پاس می دهیم:
var rewriteOptions = new RewriteOptions().AddRedirectToHttps();
app.UseRewriter(rewriteOptions);
با استفاده از URL Rewriting ، و مجبور کردن کلیه صفحات سایت برای استفاده از SSL، اقدامات لازم را برای محافظت از دادههای وبسایت خود در حین انتقال انجام میدهیم.