جلوگیری از حملات XSS در Asp.Net MVC

جلوگیری از حملات XSS در Asp.Net MVC

در سال 2016 بزرگترین حملات سراسری به شبکه ی اینترنت از طریق DDOS صورت گرفت (به واسطه تجهیزات Active و  واقعیت مجازی) که در نوع خود بزرگترین حمله DDOS در تاریخ اینترنت محسوب می گردد (تا زمان نگارش این مطلب).

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

جلوگیری از هک XSS در Asp.net mvc

بنابراین اگر به فکر امنیت در یک وب سایت هستید وقت گذاشتن برای جلوگیری از حملات XSS دارای اولویت بیشتری می باشد (البته منظور این نیست که DDOS یا دیگر روش ها را نادیده بگیرید) یادتان باشد که همیشه با ساده ترین راه کار ها می توان جلوی خطرناک ترین حملات را گرفت. موضوع این است که طراح وب (برنامه نویس و نه طراح Front-end) می بایست به این ساده ترین راه کار ها تسلط داشته باشد.

XSS چیست؟

XSS برگرفته از عبارت Cross-site scripting می باشد و من آن را به صورت زیر تعریف می کنم:

" نفوذ از طریق XSS زمانی که یک برنامه داده های نا مطمئنی (یعنی داده هایی که در زمان ورود به سیستم کنترل نمی شوند) را دریافت کند و آن‌ها را بدون اعتبار سنجی مناسب (Validation) به مرورگر ارسال کند، ممکن است رخ بدهد.

XSS نفوذ گر را قادر می‌سازد تا یک اسکریپت را در مرورگر قربانی اجرا کند که این اسکریپت می تواند Session کاربری را سرقت کند، سایت را از کار بیاندازد و یا کاربران سایت را به وب سایت های جعلی و خطرناک هدایت (Redirect) کند."

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

مثال:

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

راه حل چیست؟

ساده است.

در مثالی که ذکر شد متوجه شدید که یک بار داده های نا معتبر وارد سیستم شده و یک بار هم نمایش داده شده. پس ما می بایست تمام داده ها را هنگام ورود به سیستم و هنگام نمایش پاکسازی کنیم.

منظور از پاکسازی چیست؟

متنی که قرار است یک نام و شماره تلفن باشد یا متنی که قرار است یک دیدگاه کاربر باشد چرا باید دارای تگ هایی مانند HTML,Css یا JavaScript باشد؟ بنابراین باید تمام داده های ورودی را از این نوع تگ ها پاکسازی کرد.

پاکسازی هنگام ورود اطلاعات مهم تر است یا هنگام نمایش؟

اگر داده ی نا معتبری بتواند به طریقی وارد سیستم شود، آنگاه اگر هنگام نمایش دادن در جای جای وب سایت اطلاعات را پاکسازی کنیم در آن صورت تقریباً می توان گفت 90 درصد جلوی چنین هک هایی را گرفته ایم البته همیشه به خاطر داشته باشید که بهترین راه جلوگیری این است که تمام داده ها هنگام ورود به سیستم پاکسازی شوند و نه هنگام نمایش چرا که اگر هنگام ورود، پاکسازی صورت نگیرد در این صورت در هر حال داده های نامعتبر وارد دیتابیس سیستم شما شده ولی هنگام نمایش به کاربران فیلتر می شود که زیاد جالب نخواهد بود بنابراین پاکسازی هنگام ورود اطلاعات مهم‌تر است.

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

در یک فرم ورودِ نام و یا دیدگاهِ کاربران قرار نیست آن‌ها تگ های HTML, Css یا JavaScript وارد کنند بنابراین هنگام ثبت داده ها می بایست داده ها را پایش کرده و تمام تگ های موجود احتمالی را حذف کنید.

هنگام نمایش هم باید به همین صورت عمل کرد، قرار است یک متن ساده را به کاربران نشان دهیم پس باید تمام تگ های Script را حذف یا فیلتر کرده و آنگاه به نمایش گذاشت.

جلوگیری از حملات XSS در وب سایت های Asp.net MVC

قصد نداریم زیاد موضوع را پیچیده کنیم بلکه با معرفی ساده ترین راه کارها و پیاده سازی آن‌ها تا حد زیادی می توان جلوی این گونه هک شدن ها را گرفت. البته Asp.net Mvc به طور پیش فرض تا جای ممکن مسائل امنیتی جهت جلوگیری از حملات Xss را به صورت توکار پیاده سازی کرده است (مخصوصاً از MVC4 به بعد) که همین قابلیت خود به خود امنیت وب سایت هایی که با Asp.net MVC طراحی شده باشند را افزایش داده و موجب شده هک و نفوذ به وب سایت های Asp.net MVC به طور چشمگیری دشوار تر از بقیه تکنولوژی ها بشود به همین دلیل آمار هک وب سایت های مبتنی بر MVC Asp روز به روز کمتر می شود در حالی که درصد استفاده از آن‌ها رو به افزایش است.

با همه این شرایط اما باز هم بی اطلاعی برنامه نویس از چنین موضوعاتی ممکن است موجب بروز مشکل بشود و ما می خواهیم کاری کنیم تا برنامه نویس جلوی بروز چنین مشکلات احتمالی را نیز بگیرد.

برای جلوگیری از حملات XSS در Asp.net mvc می بایست در دو مرحله دو فرایند را انجام داد: 1- پاکسازی داده ها هنگام ورود داده ها 2- پاکسازی اطلاعات هنگام ارسال به مرورگر (یا نمایش آن‌ها)

1-پاکسازی داده ها هنگام دریافت اطلاعات از کاربران

اگر از MVC 4 به قبل استفاده می کنید تمام داده ها هنگام ورود می بایست پایش شوند و سپس در دیتابیس ذخیره گردند. این پایش داده برای هر بار ورود داده ها بسیار سخت و زمان‌بر خواهد بود تصور کنید در یک وب سایت 50 فرم ورد اطلاعات داشته باشیم بنابراین کار دشوار خواهد شد.

پاک سازی داده ها شامل حذف تگ های HTML,Css, و JavaScripts می باشد. جهت سهولت کار بهتر است از کتابخانه Microsoft Anti-Cross Site Scripting Library استفاده کنید (DLL ی با نام AntiXSS) که کتابخانه ای جهت پاکسازی داده ها می باشد و کافیست داده های ورودی خود را به متد های آن پاس بدهید تا پاکسازی شده ی آن را بر گرداند.

جدیدترین ورژن این کتابخانه را می توانید از Nuget نیز دریافت کنید:

 nuget antiXssasp.net mvc

این کتابخانه قابلیت ها و امکانات بیشمار زیادی دارد که از ذکر آن‌ها در این نوشتار خود داری می کنیم.

مثال زیر نحوه استفاده از یکی از متد های موجود در این کتابخانه را نشان می دهد

Model.Name=AntiXss.HtmlEncode(ViewModel.Name);

در این مثال نام ورودی که اکنون در ViewModel وجود دارد و توسط کاربر وارد شده است را پاکسازی کرده ایم و درون Model ریخته ایم.

اما اگر از MVC 4 یا ورژن های بعد از آن استفاده می کنید دیگر نیازی نیست داده های ورودی را از لحاظ آلوده بودن به اسکریپت ها و تگ های غیر مجاز بررسی کنید چرا که این کار به صورت تو کار در MVC تعبیه شده است.

بنابراین اگر جایی نیاز شد که داده هایی را به همراه کدهای HTML آن در دیتابیس ذخیره کنید به صورت خودکار آن داده ها نادیده گرفته می شوند برای رفع این محدودیت می بایست از AllowHtml کمک بگیرید که یا می توان آن را به یک اکشن متد انتساب داد یا به یک Property خاص:

public class Product
{
        public string ProductTitle { get; set; }
        [AllowHtml]
        public string ProductDetail { get; set; }
}

 2-پاکسازی اطلاعات هنگام نمایش به کاربران (به عبارتی هنگام ارسال به مرورگر)

هنگام نمایش هر نوع اطلاعاتی در هر کجای وب سایت باید تصور کنیم آن اطلاعات ممکن است آلوده به کد های مخرب باشند بنابراین تا جای ممکن باید آن‌ها را پاکسازی کرده وسپس به نمایش بگذاریم.

در MVC 4 به قبل بهتر است از همان کتابخانه AntiXSS استفاده کرد و به صورت مثالی که ذکر شد نیز می توان داده ها را هنگام نمایش پاکسازی کرد.

اما اگر از MVC4 به بعد استفاده می کنید دیگر نیازی به استفاده از این کتابخانه نیست و تمام داده ها هنگام نمایش به صورت پیش فرض پاکسازی می شوند.

برای مثال جهت نمایش یک فیلد متنی اگر از قطعه کد زیر استفاده کنید اطلاعات خود به خود پاکسازی می شوند:

@Html.DisplayFor(x => x.SomeProperty)

گاهی اوقات پیش می‌آید که متنی دارای تگ های HTML باشد و بخواهید آن را به نمایش بگذارید در این صورت تمام آن تگ ها نادیده گرفته می شوند. برای رفع این محدودیت می توان از کد زیر استفاده کرد:

@Html.Raw(Model.Detail)

Html.Raw که یکی از دستورات Razor است موجب می شود پاکسازی تگ ها که به صورت توکار فعال هستند، غیر فعال شود بنابراین هنگام استفاده از این کد باید نهایت دقت را داشته باشید.

نتیجه گیری:

با ساده ترین راه کارها می توان جلوی خطرناک ترین حملات را گرفت بنابراین برای جلوگیری از هک شدن وب سایت ها نیاز نیست حتما در زمینه هک و امنیت خبره باشد بلکه آشنایی ابتدایی نیز کفایت می کند. در ادامه بهتر است نکات زیر را همیشه مد نظر قرار بدهید.

پیشنهاد می شود حتی الامکان از جدیدترین ورژن MVC استفاده کنید.

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

هنگام نمایش اطلاعات سعی کنید کمتر از Html.Raw استفاده کنید.

پیروز و سربلند باشید.

جهت اطلاع از جدید ترین مطالب سایت پیشنهاد می کنیم عضو خبرنامه شوید