چطور می توان از حملات XSS در ASP.net جلوگیری نمود

بوسیله علیرضا پایدار | 1396/7/8 | مجموعه ASP.NET

0 نظر

چطور می توان از حملات XSS در ASP.net جلوگیری نمود

بیشتر مشکلات امنیتی در وب سایت ها ناشی از این است که مهندسین وب بیش از اندازه به بازدیدکنندگان اطمینان می کنند. بیشتر بازدید کنندگان تنها نیاز های خود را از سایت شما تامین می کنند اما این به این دلیل نیست که همه آنها فقط برای تامین نیاز های اطلاعاتی مفید وب سایت شما، به این وب سایت سر زده اند. خیلی از هکر ها بنا به هدفی که دارند (خوب یا بد) وارد وب سایت ها شده و به دنبال حفره های امنیتی در وب سایت ها می گردند. در این تاریخ که این مقاله را می خوانید، بیشترین حملات به وب سایت ها از این انواع می باشند:

  • SQL Injection
  • Cross Site Request Forgery
  • Cross Site Scripting

با گروه برنامه نویسی نوآوران همراه باشید تا در این مقاله نوع سوم را شرح و همچنین نحوه جلوگیری از این نوع حمله را در ASP.Net بخوانید.


نا گفتنی نیست که در نسخه های جدید ASP.net مانند نسخه ها 4.0 به بعد ، این گونه حملات به این وب سایت ها بسیار دشوار شده است. اما در هر صورت همیشه اشتباهات مهندس های وب باعث بروز حملاتی از این نوع قبیل خواهد شد. پس بهتر است ابتدا خودمان را جای مهاجم بگذاریم و بررسی کنیم که کجای نرم افزار تحت وب ما می تواند آسیب پذیری داشته باشد. ابتدا بیایید کمی در مورد چگونگی عملکرد حمله Cross Site Scripting توضیح دهیم.

حمله Cross Site Scripting چیست

حمله Cross Site Scriptin (که معمولا به آن حمله XSS نیز می گویند) به مهاجم این امکان را می دهد که به یک وب سایت مطمئن و امن کد های مخرب را تزریق کند. این تزریق به نحوی می باشد که هیچ کس متوجه آن نخواهد شد. سپس این کد های مخرب در همان وب سایت اجرا خواهند شد. هدف این کد های مخرب دسترسی به تمام منابع اطلاعاتی وب سایت آلوده شدن مانند اطلاعات کوکی ها و یا session ها خواهد بود.

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

زمانی که در اینترنت وب گردی می کنید (مهم نیست از طریق چه برنامه و یا سیستم عاملی) وارد وب سایت هایی می شوید که بدنبال آن ها هستید. بیشتر این وب سایت ها به درستی فقط می خواهند اطلاعاتی که مورد نیاز شما است را به نمایش بگذارند، و شما به آنها اطمینان دارید، اما متاسفانه وب سایتی که آلوده شده باشد هیچ علائمی ناشی از آلودگی را از خود نشان نمیدهد و هیچ کس متوجه آلوده شدن این وب سایت نمی شود. کاربران نیز براحتی در این وب سایت ها ثبت نام و اطلاعات محرمانه خودشان را در آن ثبت خواهد کرد. وب سایت آلوده شده تمام این اطلاعات را در اختیار فرد مهاجم خواهد گذاشت و به این ترتیب اطلاعات مهم کاربران (شماره حساب، رمز های عبور، آدرس ایمیل ها، شماره تماس و آدرس) در معرض نمایش گذاشته می شود.

ما قبلا در باره حملات XSS دائمی و موقتی در پست حمله xss چیست؟ توضیح دادیم و می توانید آنجا انواع این نوع حمله را مطالعه نمایید. اما نوع سومی هم وجود دارد!

حملات مبتنی بر DOM

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

وجه مشترک تمام این سه نوع حمله در این است که در نهایت کد های مخرب می بایست به سرور قربانی ارسال شوند و اهمیتی ندارد که چطور این کد ها ارسال می شوند. در یک حمله XSS موفق، مهاجم می تواند به محتویات کوکی ها و session ها دسترسی داشته باشد. سپس با جعل شناسه کوکی و session مورد نظر می تواند به صورت غیر مجاز وارد ناحیه کاربری مشتریان شود و به تمام اطلاعات آن ها دسترسی داشته باشد. حتی فرد مهاجم می تواند تمام اطلاعات محتوای یک صفحه را تغییر و دستکاری کند. در حمله های پیشرفته تر ، مهاجم می تواند از طریق کد key logger به رمز عبور حساب های بانکی مشتریان نیز دسترسی پیدا کند.

چطور از حملات XSS در امان بمانیم

برای اینکه بتوانیم از حملات XSS در امان بمانیم، مهمترین نکته این است که هیچ ورودی را که کاربر به آن دسترسی دارد را به حال خود رها نکنیم. در ادامه چند روش برای مقابله با این حملات را در ASP.net توضیح خواهیم داد.

روش یکم : اعتبار سنجی همه ورودی ها

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

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

اعتبار سنجی همه ورودی ها

 در کد بالا، چنانچه برنامه نتواند مقدار صفحه قبلی را از متغیر externalValue به عنوان یک عدد صحیح اعتبار سنجی کند، به صفحه قبلی همراه با نمایش خطای ورودی باز خواهد گشت، در غیر اینصورت مطمئن هستیم که ورودی یک عدد صحیح می باشد. در این روش شما می توانید ورودی ها با انواع رایج داده ای را کنترل نمایید.

روش های دیگری نیز داریم.  کلاس Uri در دات نت دارای متدی بنام IsWellFormedUriString که میتواند محتویات آدرس URL را اعتبار سنجی کند.

اعتبار سنجی همه ورودی ها

در متد بالا قبل از اینکه URL نشان داده شود، ورودی کاربر اعتبار سنجی می شود. در این شرایط URL تنها زمانی نشان داده خواهد شد که ورودی کاربر مطابق با یک URL صحیح باشد.

اما برای ورودی های پیچیده تر نیاز به توابع پیچیده تر برای اعتبار سنجی می باشد. برای مثال اعتبار سنجی شماره کارت حساب بانکی به این صورت باید باشد که تنها فقط اعداد خاصی را قبول کند و به کاربر اجازه ورود رشته و کاراکتر های غیر عددی را ندهد. برای اعتبار سنجی رشته های پیچیده تر از این نیز نیاز به توابع  regular expressions خواهیم داشت.

درخواست اعتبار سنجی در ASP.NET

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

درخواست اعتبار سنجی در ASP.NET

البته برای توسعه دهندگان همیشه صرفه جویی در زمان توسعه بیشتر مهم می باشد که متاسفانه یکی از راه های اشتباهی که آنها انجام می دهد خاموش کردن این ویژگی در فایل web.config می باشد.

پیشنهاد ما این است که بجای اینکه این ویژگی را برای تمام سایت خاموش و غیر فعال کنید بهتر است که فقط این ویژگی را برای صفحه مورد نظر غیر فعال کنید. در نسخه های اولیه ASP.NET می توانید با اضافه کردن خاصیت "validateRequest="false در تگ page صفحه مربوطه ، میتوانید این ویژگی را در آن صفحه غیر فعال کنید.

همچنین در نسخه های ASP.NET MVC نیز می توان از طریق اضافه کردن صفت [(ValidateInput(false] نیز ویژگی اعتبار سنجی برای صفحه مورد نظر را خاموش نمایید. یا اگر می خواهید ویژگی اعتبار سنجی فقط برای یک فیلد در بین فیلد های دیگر صفحه غیر فعال شود، کافیست تنها صفت [AllowHtml] را به آن فیلد اضافه نمایید.

در ASP.NET نسخه 4 به بالا ، اعتبار سنجی چندین تغییر داشته است. در این نسخه های جدید، اعتبار سنجی فقط بر روی صفحات وب انجام نمی شود، بلکه بر روی تمام درخواست ها ASP.NET اعتبار سنجی انجام می شود. این اعتبار سنجی شامل ماژول های سفارشی شده HTTP نیز می باشد. توسعه دهندگان برای صفحاتی که وابسته به متد های قدیمی تر هستند می توانند از طریق تنظیم صفت requestValidationMode به مقدار 2.0 در web.config این قابلیت را فعال کنند.

درخواست اعتبار سنجی در ASP.NET

یا حتی بهتر از آن می توانند این ویژگی را فقط برای صفحاتی خاص فعال نمایند.

درخواست اعتبار سنجی در ASP.NET

برای نسخه های جدید ASP.NET تنها کافیست مقدار 2.0 را به مقدار 4.0 یا 4.5 (بستگی به نسخه فریم ورکی که با آن کار می کنید) تغییر دهید.

اما در نسخه 4.5 خاصیت HttpRequest.Unvalidated نیز اضافه شده است. این خاصیت اجازه می دهد تا خیلی راحت تر بتوان فرم هایی که نیاز به اعتبار سنجی ندارند را مشخص نمود.

این ویژگی ها در ASP.NET وجود دارند تا برنامه نویسان به هیچ عنوان ویژگی اعتبار سنجی را برای کل صفحات خاموش و یا غیر فعال نکنند، در غیر این صورت عواقب اینکار پای خودشان می باشد.

encode کردن HTML

با توجه نمود که قبل از اینکه داده ها بر روی یک صفحه وب نشان داده شوند، کد های HTML مربوطه می بایست بصورت encode شوند و همچنین فراموش نکنید که این فرایند توسط مرورگر انجام نخواهد شد.

بهتر است همیشه برای خروجی و نشان دادن داده ها از عملیات زیر استفاده نمایید.

بجای استفاده از

Lable1.Text=TextBox1.Text;

اینطور استفاده کنید

Label1.Text = (Server.HtmlEncode(TextBox1.Text));

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

مهندسانی که از ASP.NET برای توسعه نرم افزار های تحت وب خود استفاده می کنند، می توانند از کتابخانه  AntiXSS Libraryاستفاده نمایند.

در اینجا شما می توانید براحتی مراحل کار با این کتابخانه ارزشمند را مطالعه و یاد بگیرید. این کتابخانه شامل هزاران تابع برای اعتبار سنجی ورودی کاربران شامل HTML، صفت های HTML ، XML، CSS و JavaScript می باشد.

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

شرکت مایکروسافت این کتابخانه را در نسخه 4.5 در فضای نامی System.Web.Security.AntiXss نیز قرار داده است. چنانچه از ASP.NET 4.5 استفاده می کنید، پیشنهاد می کنم حتما از این کتابخانه برای بالا بردن امنیت وب سایتتان استفاده نمایید.


چنانچه این خبر مورد رضایت شما می باشد آن را با دوستانتان به اشتراک بگذارید