در این مقاله به بررسی چند نکته امنیتی میپردازیم که برای هر وب سایتی الزامیست.

  1. لاگین خود را امن پیاده سازی کنید
  2. همیشه داده های مهم را هنگام ارسال رمزنگاری کنید
  3. کوکی کاربر را بعد از خروج پاک کنید
  4. همیشه از SSL استفاده کنید
  5. هیچ وقت داده های مهم را به طور ساده در دیتابیس ذخیره نکنید
  6. هیچ وقت خطاها را به سمت کلاینت نشان ندهید
  7. Cross-Site Scripting XSS
  8. ورژن NetCore. را مخفی کنید
  9. Cross-Site Forgery Token CSRF
  10. جلوگیری از Sql Injection
  11. همیشه از فریمورک ها و کتابخانه های به روز استفاده کنید.

1 - لاگین خود را امن پیاده سازی کنید

صفحه لاگین مانند یک در ورود برای هر وب سایتی است. یک پنل مدیریت وب سایت را در نظر بگیرید, اگر یک کاربر به پنل مدیریت دسترسی پیدا کند کل سیستم را در دست میگیرد. بنابراین اول از همه باید لاگین خود را بسیار امن پیاده سازی کنید.

جلوگیری از حملات Brute Force : حملات Brute Force یکی از متداول ترین حملات است که با استفاده از الگوریتم های مختلف و امتحان کردن نام کاربری و رمزعبورهای مختلف برای ورود به سیستم تلاش میکند. همچنین تلاش های زیاد برای ورود به سیستم میتواند باعث مشغول شدن سرور شما شود که باعث از کار افتادن سرور شما یا به اصطلاح سرور شما داون میشود.

اما چگونه از این حملات تا حد امکان جلوگیری کنیم؟

  • در صفحه لاگین از Captcha استفاده کنید. زیرا بیشتر ربات ها نمیتوانند  Captcha را پر کنند.
  • بلاک کردن IP بعد از چند عملیات ورود ناموفق.
  • در هنگام ثبت نام, از نام کاربری ها و رمزعبور ساده جلوگیری کنید مانند admin,user,admin123,adminadmin و...
  • در هنگام ثبت نام کاربران, برای رمز عبور کاربر را وادار کنید به استفاده از حروف بزرگ و کوچک ( A-Z , a-z ), عدد ( 9-0 ) و حروف ویژه مانند ( !, @, ., #, $, %, ^, &,*  ).
  • همیشه از ویژگی های Asp.Net Core Identity استفاده کنید. Asp.Net Core Identity یک سیستم مدیریت کاربران است که ورود و ثبت نام را همراه با بهترین روش های امنیتی برای ما فراهم میکند.

2 - همیشه داده های مهم را هنگام ارسال رمزنگاری کنید

هیچ وقت داده های مهم مانند کلمه عبور, کارت اعتباری را به صورت فرم واقعی خود به سرور ارسال نکنید. همیشه از الگوریتم های هشینگ مانند MD5 یا SHA256 برای کلمه عبور استفاده کنید و از رمزنگاری های AES یا DES در سمت کلاینت استفاده کنید(استفاده از jQuery ).

3 - کوکی کاربر را بعد از خروج پاک کنید

در هنگام ورود کاربر به سایت, ما داده های لازم را در سشن ( Session ) برای ورود به سیستم  نگه میداریم تا زمانی که کاربر از سایت خارج شود. همزمان یک کوکی به نام AspNetCore.Session در مرورگر کاربر ست میشود برای نگه داری اطلاعات ورود به سایت. بنابراین زمانی که کاربر از سایت خارج میشود باید کوکی ایچاده شده برنامه را در مرورگر کاربر پاک کنیم زیرا هکرها میتوانند از این کوکی برای دسترسی های غیرمجاز استفاده کنند. به این حالت Session Fixed Attack نیز گفته میشود.

4 - همیشه از SSL استفاده کنید

SSL مخفف Secure Socket Layer است که یک ارتباط رمزنگاری شده با یک کلید قوی را بین کلاینت و سرور ایجاد میکند. در کلاس Startup.cs هنگام تعریف کوکی ها شما میتواند از Secure Policy for Cookies استفاده کنید که این کار باعث میشود که مرورگر فقط درخواست هایی را که بر روی https باشند را هدر کوکی را درج کند. از این طریق کوکی هرگز از طریق http ارسال نمیشود. این کار را میتوانید به صورت زیر انجام دهید.

   services.AddAuthentication()
            .AddCookie(options =>
            {
                options.AccessDeniedPath = "/AccessDenied";
                options.Cookie.HttpOnly = true;
                options.LoginPath = "/Account/Login";
                options.LogoutPath = "/";
                options.ExpireTimeSpan = TimeSpan.FromDays(15);
                options.SlidingExpiration = true;
                options.Cookie.IsEssential = true;
                options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
            })

5 - هیچ وقت داده های مهم را به طور ساده در دیتابیس ذخیره نکنید

در همه اپلیکیشن های تحت وب یک دیتابیس وجود دارد که اطلاعات کاربران را ذخیره میکند. به همین دلیل اکثرا هکرها برای سرقت اطلاعات کاربران به سرور حمله میکنند. بنابراین اگر کسی به دیتابیس دسترسی پیدا کند میتواند اطلاعات کاربران به راحتی پیدا کند. برای جلوگیری از این کار باید تمامی فیلدهای مهم مانند کلمه عبور, شماره تلفن, کارت اعتباری و... اطلاعات مهم کاربر باید به صورت رمزگذاری شده یا هش شده در دیتابیس ذخیره شود. در EF Core قابلیتی وجود دارد که فیلد های مورد نظر را میتوان هنگام ذخیره در دیتابیس رمزنگاری کرد و هنگام خواندن از دیتابیس آنها را به صورت عادی نمایش داد. با این کار دیتاها در دیتابیس رمزنگاری شده و عملا اگر دیتابیس هم هک شود اطلاعات مهم کاربران به سرقت نمیرود.

6 - هیچ وقت خطاها را به سمت کلاینت نشان ندهید

بعضی از خطاها میتوانند باعث شوند که اطلاعات مهم و یا چند خط از کدهای نوشته شده, در سمت کلاینت نمایش داده شوند. هکرها افراد باهوشی هستند آنها میتوانند با اطلاعات بدست آمده امنیت وب سایت را به خطر بیاندازند. بنابراین قبل از پابلیش پروژه بر روی سرور مطمئن شوید که صفحه مدیریت خطاها ( ExceptionPage ) به درستی تنظیم کرده اید.

7 - Cross-Site Scripting XSS 

در حملات XSS, هکرها برای سرقت اطلاعات کاربران یک فایل جاوااسکریپت مخرب را در ورودی ها به سرور ارسال میکنند. به عنوان مثال در وب سایت ما یک فرم افزودن محصول داریم. هکر یک محصول جدید ایجاد میکند و در قسمت توضیحات محصول یک کد جاوااسکریپت وارد میکند. و هنگامی که برنامه ما آن محصول را در سایت نشان میدهد, اسکریپت هکر اجرا شده و کارهای که نیاز است را انجام میدهد.

برای جلوگیری از این کار میتوانیم کارهای زیر را انجام دهیم

  • استفاده از Regular Expression در هردو سمت کلاینت و سرور برای اعتبار سنجی داده ها
  • استفاده از Html.Encode برای نمایش خروجی ها
  • همچنین Url ها را توسط UrlEncoder اعتبار سنجی کنید