بررسی مختصر مساله ی امنيت در برنامه های ASP.NET و نحوه ارتباط آن با کاربر
مقدمه
امنيت يکی از مسائل اصلی برای توسعه دهندگان و معماران برنامه های کاربردی است. همان گونه که تعداد بیشماری از سايتهای وب نیازمند انواع امنيت ها است، توسعه دهندگان نيز بايد بدانند چگونه با مقوله امنيت کار کنند و چه مدل امنيتی مناسبی برای برنامه های کاربردي شان انتخاب نمایند.
بعضی از سايتهای وب اطلاعات خاصی را از کاربر معمولی دريافت نمی کنند، اما اطلاعات موجود در خود را منتشر می کنند. همانند موتورهای جستجو در حاليکه سايتهای ديگری وجود دارند که نيازمند جمع آوری اطلاعات حساس از کاربرانشان هستند (برای مثال شماره کارت های اعتباری و ديگر اطلاعات شخصی). اين سايتهای وب به پياده سازی امنيت مستحکم تری برای جلوگيری از حمله احتمالی موجوديت های خارجی نيازمندند.
تفاوت جريان امنيتی ASP و ASP.NET
جريان امنيتی صفحات ASP.NET از جريان امنيتی ASP کلاسيک متفاوت است. در ASP، بصورت پيش فرض IIS خود را به عنوان يک کاربر معتبر معرفی می نمايد در حاليکه در ASP.NET توسعه دهنده کنترل بيشتری بر روی تنظيم امنيت در سطوح مختلف را دارا می باشد.
عمليات اساسی امنيتی ASP.NET
Authentication:
عبارت است از روند اعتباردهی هويت يک کاربر به پذيرفتن يا رد کردن يک درخواست، يعنی دريافت گواهی نامه ها (برای مثال نام کاربر و کلمه عبور) از کاربران و اعتبار دهی آن. بعد از اينکه هويت بررسی شد و معتبر تشخيص داده شد، کاربر بصورت قانونی مطرح می شود و درخواست های دسترسی به منابع انجام می شود. بصورت ايده آل درخواست های آتی همان کاربر تا هنگام خروج از سيستم مرتبط با روند Authentication نيست.
Authorization:
عبارت است از روند تضمين نمودن اينکه کاربران با هويت های معتبر مجاز به دسترسی به منابع مشخصی هستند.
Impersonation:
اين روند يک برنامه کاربردی را قادر می سازد تا به نوبت هويت کاربر و درخواستهای بعدی او برای ساير منابع را تضمين کند. دسترسی به منابع متناسب با هويت کاربری که جايگزين شده است (Impersonated) تاييد يا رد می گردد. به عبارت ديگر Impersonation يک پروسه سرويس دهنده (Server Process) را قادر می سازد تا با استفاده از امنيت گواهی نامه سرويس گيرنده ها (Client) اجرا شود.
چرا به دات نت احتياج داريم؟
آشنائی با دات نت و بررسی مشکلاتی که حل آنها سبب تولد دات نت گرديد.
به طور معمول نسل های جديد زبان های برنامه نويسی به اين دليل متولد می شوند که زبان های قديمی تر دارای امکانات محدود بودند و يا قدرت استفاده از تکنولوژی های فعلی را به صورت مطلوب و ساده ندارند.
مهمترين نيازی که به عنوان آخرين تکنولوژی وجود دارد، برنامه نويسی در محيط اينترنت است. اينترنت در مدت تقريبا ۸ سال جای خود را به عنوان يکی از مهمترين وسايل ارتباطی برای کارهای روزمره و تجارت باز کرده است. سيستم های برنامه نويسی قديمی تر امکان برنامه نويسی برای اينترنت را فراهم کرده بودند اما هر کدام دارای اشکالات بزرگی هستند، برای مثال تکنولوژی COM اولين بار در ويندوز به کار گرفته شد. در سال 1970 نيز سيستم هايی برای Unix نوشته شده بودند، جاوا نيز در اصل برای ابزارهای الکترونيکی بود و نه برای اينترنت.
سپس برای اولين بار يک سيستم جامع برای برنامه نويسی تحت اينترنت ايجاد شد. اين سيستم -NET. از مراحل سطح پايين که به زبان ماشين می باشد تا بالاترين سطح که برنامه نويسی ويژوال آن می باشد برای استفاده در اينترنت طراحی شده است. البتهNET. فقط برای اينترنت نيست و با استفاده از آن می توان برنامه های کامل تحت Client نيز ايجاد کرد، اما بزرگترين مزيت آن دربرابر سيستم های ديگر امکانات اينترنت آن است.
برای اينکه مزايای استفاده ازNET. را بهتر متوجه بشويم بهتر است در ابتدا معايب سيستم های پيشين را ذکر کنيم. شرکت مايکروسافت تا قبل از سال 1995 به برنامه نويسی در محيط های Client و Server می پرداخت، اما از آن سال به بعد توجه بيشتری به مساله برنامه نويسی در اينترنت کرد. مايکروسافت COM و +COM را ايجاد کرد و آنها را در ويژوال استوديوی 6 به کار گرفت. در سال 1999 حدود ۵۰ در صد از بزرگترين سايتهای تجارت الکترونيکی از محصولات مايکروسافت استفاده می کردند. اما هنوز هم مشکلات بزرگی در سيستم های مايکروسافت وجود داشت که يکی از آنها دشواری نوشتن برنامه در اينترنت با محصولات مايکروسافت بود. شرکت مايکروسافت برای راحتی کار برنامه نويس ها ASP يا Active Server Page را ايجاد کرد. با اينکه اين يک قدم بزرگ بود و کارها را بسيار ساده کرد ولی هنوز از برنامه نويسی شی گرا پشتيبانی نمی کرد. همچنين در ويژوال استوديوی 6 قسمتی برای Internet Application ايجاد شده بود و در آنها امکان ساختن Web Class وجود داشت ولی هيچ وقت به عنوان يک ابزار کار آمد برای برنامه نويسی وب درنظر گرفته نشد.
مدل برنامه نويسی DNA
مايکروسافت يک مدل برنامه نويسی به نام DistributedinterNet Application دارد که بر پايه برنامه نويسی n-tier و COM بنا نهاده شده است. مدل DNA از سه بخش اساسی تشکيل شده است.
بخش اول
به نام Presentation tire معروف است. در اين بخش رابط تصويری کاربر وجود دارد و خود نيز به دو نوع Internet Browser و Win 32 GUI تقسيم می شود که هر کدام مشکلات خاص خود را دارند. در مدلی که از Win32 GUI يا همان نرم افزارهای معمولی استفاده می شود دو مشکل بزرگ وجود دارد ؛ دشواری بروز رسانی نرم افزار و ديگری DLLHell که در ادامه توضيح داده خواهد شد. در نوع دوم مشکلاتی از قبيل نبود امکانات برنامه نويسی کافی در محيط مرورگر، نبود رابط قوی با کاربر، نبودن مرورگر های يکسان و... وجود دارد. همچنين هميشه يک اتصال به اينترنت يا اينترانت لازم است. در اين نوع از برنامه نويسی می توان از Java Applet ها يا ActiveX استفاده کرد ولی مرورگر بايد امکان استفاده از آن را داشته باشد، مخصوصا ً هنگام استفاده از ActiveX که بايد فقط از IE استفاده کرد.
بخش دوم
که Middle tier نام دارد، مکانی است که اطلاعات و قوانين تجاری در آن وجود دارد. منظور از قوانين ، متد ها و اجزائی هستند که اعمال کاربران را کنترل می کنند. مهمترين و آسان ترين زبان برای نوشتن اين اجزا از DNA ويژوال بيسيک است. برنامه نويسی که بخواهد در اين رده برنامه بنويسد بايد آشنايی کاملی با COM و پروتکل های رايج داشته، همچنين بايد مهارت کافی در استفاده از ADO و ADSI داشته باشد. مشخص است که يک اشتباه در اين لايه باعث بروز خطا و نقص در کل سيستم می شود.
بخش سوم
يا Data tier مکانی است که اطلاعات سازمان در آن ذخيره می شود. معمولا ً در اين قسمت از بانکهای پيشرفته رابطه ای مانند SQL Server و Oracle استفاده می کنند.
محدوديت های COM
همانطور که ديديد مهمترين قسمت در DNA همان COM است که در جای جای آن استفاده می شود. در اينجا برخی معايب COM ذکر می شود : ( در ابتدای متن ذکر شد که برای درک نياز بهNET. بايد ابتدا معايب سيستم های قديمی را بشناسيم )
DLL Hell:
اگر کوچکترين تغييری در يک COM ايجاد شود، ديگر برنامه هايی که از ورژن قبلی استفاده می کردند قادر به فعال ساختن نسخه جديد نيستند. هنگامی که در ويندوز، يک COM نصب شود برايش در رجيستری يک GUID ثبت می شود که اطلاعات آن COM را در خود ذخيره می کند. اگر يک برنامه از نسخه اول يک COM استفاده کند و بعد از مدتی شما تغييراتی در نسخه اول بدهيد و بخواهيد آن را دوباره در سيستم نصب کنيد ويندوز به شما پيغام خطا می دهد چون ورژن آن تکراری است، اگر هم آن را به ورژن دوم ارتقا دهيد نرم افزار قبلی هنوز به دنبال نسخه اول می گردد. اين امر باعث می شود که شما مجبور شويد يکبار ديگر کل برنامه را کامپايل کرده و در کامپيوترتان نصب کنيد.
کمبود در وراثت:
در نسخه های COM که در حال حاضرهستند چيزی به نام وراثتی که در ++C وجود دارد نمی باشد، بلکه وراثت تنها در واسط يک COM می باشد، استفاده از آن هم چندان کمکی به برنامه نويسی نمی کند.
برخی محدوديت های برنامه نويسی اينترنتی در مدل DNA
۱- وجود دو محيط برنامه نويسی برای اينترنت و Client
نقصان در نوشتن برنامه هايی با رابط گرافيکی خوب که در اينترنت کار می کردند کاملا ً مشهود است، نمونه بارز آن اختلاف در برنامه نويسی در ويژوال بيسيک و ASP است. ويژوال بيسيک با رابط گرافيکی کاملا ً سطح بالا و ASP تقريبا ً رابط گرافيکی ندارد. همين امر باعث می شد که يک برنامه نويس مجبور باشد طيف وسيعی از تکنيک ها و زبان ها را فرابگيرد تا بتواند برنامه ساده ای در اينترنت بنويسد.
۲- نبودن حالت های ذخيره اطلاعات رابط گرافيکی در صفحه های اينترنتی
نمونه اين حالت زمانی است که در يک textbox متنی وجود داشته باشد. در برنامه های Win32GUI متن داخل textbox تا زمانی که کاربر يا برنامه آن را تغيير نداده بر جای خود وجود دارد. اما در محيط اينترنت و نوع ASP با هر بار refresh کردن صفحه کل اطلاعات ازبين می رود. البته اين مشکل با استفاده از شئ های Request و Response تقريبا ً قابل حل است ولی احتياج به برنامه نويسی برای هر تکه از صفحه ASP دارد.
۳- نداشتن Event Handler در محيط برنامه نويسی اينترنت
يکی از مهمترين ابزاری که در برنامه نويسی Win32 GUI وجود دارد استفاده از Event ها است. با تکنولوژی که در حال حاضر وجود دارد تنها راه رسيدن به اين مهم استفاده از ActiveX است که به علت مسايل امنيتی در بيش از ۹۵ در صد مواقع توسط کاربر استفاده از آن رد می شود.
معايب استفاده از API
API ها توابعی هستند که از ويندوز نسخه 1 تا امروز در برنامه نويسی کاربرد داشته و دارند. مهمترين کاری که اين توابع انجام می دهند انجام کارهای سخت و سطح پايين سيستمی است که احتياج به برنامه نويسی زيادی دارند و يا حتی امکان ايجاد آن با زبان هايی مثل ويژوال بيسيک نيست. اما هر API از هر نسخه ويندوز تا نسخه ديگر آن می تواند دچار تغييرات بشود. برای مثال برنامه ای که در ويندوز 98 نوشته شده باشد می تواند در ويندوز 95 اجرا نشود. همچنين هم اکنون ابزارهای جديدی به بازار آمده است که برای آنها نيز می توان برنامه نويسی کرد، مانند تلفن های سيار، کيوسک تلفن، دستگاه های کامپيوتری جيبی و غيره. در اين نوع دستگاه ها ديگر ويندوز به مفهومی که در حال حاضر وجود دارد قابل اجرا نيست و در نتيجه API هم وجود ندارد. لازم به ذکر است که ويندوز CE برای دستگاه های مذکور می باشد ولی قابليت های آن با ويندوزهای ديگر تفاوت زيادی دارد
مقدمه ای بر Microsoft.NET
ASP.NET عضوی از بدنه NET. و متعلق به ميکروسافت است. شرکت ميکروسافت موفقيت خود را با سرنوشت NET. گره زده است. بنابراين شايد جالب باشد که بدانيم NET. چيست؟ بدنه NET. دارای دو قسمت اصلی است: قسمت اول يک کتابخانه عظيم از کلاس های آماده است و قسمت دوم يک محيط زمان اجرا می باشد.
کتابخانه کلاس ها در NET.
کتابخانه NET. دارای بيش از ۳۴۰۰ کلاس آماده جهت استفاده در برنامه ها است. بعضی از اين کلاس ها همان کلاس های پايه مانند آرايه و رشته هستند. اما عمده اين کلاس ها به پياده سازی اعمال تخصصی مانند کار با فايل و يا توليد مستندات XML پرداخته اند.
• فضانام ها در NET.
انبوه کلاس های موجود در NET. به حال خود رها نشده اند بلکه اين کلاس ها در يک دسته بندی سلسله مراتبی به نام namespace يا فضانام چيده شده اند. بعنوان مثال کليه کلاس های مربوط به کار با فايل ها در فضانام System.IO دسته بندی شده اند. بنابراين با استفاده از نام کلاس و فضانام مربوطه هر کلاس بصورت منحصربفردی مشخص می شود. بعنوان مثال جهت دسترسی به کلاس File در فضانام System.IO می توان از عبارت System.IO.File استفاده کرد.يک دسته از فضانام ها بطور خاص برای برنامه نويسی در ASP.NET در نظر گرفته شده اند. اين فضانام ها با System.Web شروع می شوند. بعنوان مثال کليه ابزارهای HTML در فضانام System.Web.UI.HTMLControls و ابزارهای Web در فضانام System.Web.UI.WebControls قرار دارند.
• مجموعه ها در NET.
کلاس های موجود در NET. در قالب مجموعه ها (Assemblies) جاسازی شده اند. نکته مهم اين است که در اينجا يک مجموعه با يک فضانام اشتباه نشود. يک مجموعه عبارت است از يک يا چند فايل که کد برنامه مربوط به کلاس ها در آن قرار دارد. برای مثال، کليه کلاس های موجود در فضانام System.IO در يک مجموعه بنام Mscorlib.dll قرار دارد. مجموعه Mscorlib.dll يک فايل معمولی است که در ديسک سخت يک کامپيوتر حاوی NET. در کنار ساير فايل ها قرار می گيرد. برای يک فضانام مهم نيست که کلاس های آن بروی ديسک چگونه ذخيره شده است. کلاس های يک فضانام ممکن است در قالب چند مجموعه ذخيره شده باشند و از طرف ديگر يک مجموعه ممکن است حاوی کلاس های چند فضانام باشد. يک فضانام عبارت است از دسته بندی منطقی کلاس ها در محيط برنامه نويسی در حاليکه يک مجموعه، دسته بندی فيزيکی کلاس ها بروی ديسک سخت است
زبان مشترک زمان اجرا در NET.
قسمت دوم بدنه NET. يک محيط يا زبان برای زمان اجرا است که زبان مشترک زمان اجرا (The .NET Common Language Runtime - CLR) نام دارد. در اولين فراخوانی يک صفحه ASP.NET آن صفحه ابتدا کامپايل شده و سپس اجرا می گردد و کد حاصله جهت مراجعات بعدی و جلوگيری از کامپايل مجدد بروی سرور نگهداری می شود. اين کد کامپايل شده يک کد ميانی است که زبان آن زبان جديدی است بنام زبان ميانی ميکروسافت (Microsoft Intermediate Language) يا MSILيا به اختصار IL نام دارد. MSIL مشابه کد زبان اسمبلی است. با اين تفاوت که دارای ويژگيهای شئ گرا است و مستقل از پردازنده کامپيوتر طراحی شده است. صفحات ASP.NET با هر زبانی که نوشته شوند در نهايت به کد MSIL تبديل می شوند. سپس کد MSIL در زمان اجرا توسط کامپايلری بنام JIT به کد زبان ماشين مربوطه تبديل می شود. در واقع اينکه صفحات ASP.NET قبل از اجرا به کد ميانی MSIL تبديل می شوند دلايل مهمی دارد. دليل اول اينکه اين مساله دست برنامه نويس را در انتخاب زبان برنامه نويسی باز می گذارد بدون آنکه تفاوتی در نتيجه چه از جهت سرعت و چه از جهت کارآئی برنامه احساس شود. بعنوان مثال شما می توانيد يک صفحه ASP.NET را با زبان ويژوال بيسيک بنويسيد در حاليکه سرعت اجرای آن همان سرعت برنامه ای است که با #C يا ++C نوشته شده است. و اين به آن دليل است که هر زبانی که برنامه نويس انتخاب کند در نهايت برنامه توليد شده به کد MSIL تبديل خواهد شد.
دليل دوم اينکه چون همه زبان های NET. به يک زبان ميانی تبديل می شوند، لذا اين زبان ها در کنار يکديگر بخوبی کار می کنند. بعنوان مثال شما می توانيد از کلاسی که به زبان ويژوال بيسيک نوشته شده است در زبان #C استفاده نمائيد.
نکاتی جهت بهينه سازی برنامه های ASP.NET
در اين مقاله با نکاتی آشنا می شويد که جهت بهينه سازی و افزايش کارآيی و سرعت برنامه های ASP.NET لازم می باشند.
اگرچه ASP.NET مدل جديدی از برنامه نويسی تحت وب می باشد و آمده است که نواقص و کمبودهای قبلی را برطرف نموده و به کارآيی برنامه های تحت وب بيافزايد، اما شما همچنان نياز داريد که جهت کارآيی و بهينه بودن برنامه هايتان نکاتی را رعايت کنيد. اين نکات جهت افزايش کارآيی، سرعت و صرفه جويی در مصرف منابع بر روی سرور است. جهت دستيابی به ليست کامل و مفصل اين نکات به اين آدرس در سايت MSDN مراجعه نمائيد. چکيده برخی از اين نکات بشرح زير است:
Session State را در صورت عدم نياز حتما غيرفعال نمائيد.
بصورت پيش فرض وضعيت Session State برای هر صفحه فعال است. اگر مطمئن هستيد که در آن صفحه از متغيرهای Session استفاده نمی کنيد، حتما آن را در دايرکتيو Page بالای صفحه تان با قراردادن آن برابر False غيرفعال کنيد تا بدين ترتيب منابع اضافی در سرور مصرف نشود. اگر هم مطمئن هستيد که در کل برنامه يا سايت تان نمی خواهيد از متغيرهای Session استفاده کنيد می توانيد آن را در web.config بطور کلی غيرفعال کنيد.
از رفت و برگشت های زياد از حد پرهيز کنيد.
فرم های وب جهت پردازش بايد به سرور ارسال شده و نتيجه پردازش برگشت داده شود. به اين عمل يک رفت و برگشت يا roundtrip می گويند. از آنجا که اين رفت و برگشت ها برای سرور ايجاد بار پردازشی و ترافيک می کنند، سعی کنيد بگونه ای از کنترلهای وب استفاده کنيد که حداقل رفت و برگشت را داشته باشيد و تا جائيکه می توانيد از پردازش های سمت کاربر برای کارهای ساده استفاده کنيد.
از کنترل های سرور با احتياط استفاده کنيد.
اگرچه کنترلهای سرور دارای قابليتهای بسيار زياد و جالبی می باشند اما اين قابليتها ناشی از اجرای آنها بر روی سرور است. از آنجا که هر اجرائی بر روی سرور ايجاد بار اضافی در سرور می کند لذا در استفاده از اين نوع کنترلها خست بخرج دهيد و اگر جائی می توانيد از کنترلهای معمولی HTML استفاده نمائيد حتما اين کار را بکنيد.
از Page.IsPostback استفاده کنيد.
استفاده از Page.IsPostback سبب کاهش رفت و برگشت های (round trip) اضافی می گردد. همچنين به شما کمک می کند که تشخيص دهيد چه موقع نياز به توليد داده جديد برای يک صفحه داريد.
تا آنجائيکه ممکن است از View State استفاده نکنيد.
View State هم مانند Session State برای نگهداری اطلاعات و سابقه يک فرم از منابع سرور استفاده کرده و به حجم صفحات اضافه می کند. از طرفی اين حالت بصورت پيش فرض فعال می باشد. لذا در صورتيکه به آن نياز نداريد از آن استفاده نکنيد و حالت آن را غيرفعال نمائيد.
از Strict="true" در صفحات تان استفاده کنيد.
جهت استفاده از مزايای earlybinding از عبارت فوق در دايرکتيو Page استفاده کنيد. اين مساله سبب می شود تا شما مجبور شويد تايپ هر متغير را در لحظه تعريف آن متغير بصورت صريح مشخص کنيد. همانطور که می دانيد درVB.NET و JScript.NET جهت پوشش برنامه های ASP کلاسيک که بدون تايپ بود، می توانيد تايپ يک متغير را در لحظه تعريف آن مشخص نکرده بلکه بعدا هنگام انتساب مقادير به آن، اين کار (تعيين تايپ) بصورت خودکار انجام شود. اين مساله سبب صرف منابع اضافی در سرور می گردد.
از Stored Procedure استفاده کنيد.
اگر از بانک اطلاعاتی در برنامه تان استفاده می کنيد، سعی کنيد که حتما پرس و جوهای (query) خود را به روال های ذخيره شده (stored procedure) بسپاريد. از آنجائيکه اين روال ها برای مراجعه اول کامپايل شده و از آن پس جهت اجرا در اختيار مدير بانک اطلاعاتی (DBMS) قرار می گيرد، نسبت به پرس و جوهای معمولی درون برنامه ای بسيار کاراتر و سريعتر هستند. از طرفی با بهينه سازی خاصی که برای گرداننده (driver) SQLServer در مجموعه دات نت شده است، سرعت اجرای روال های ذخيره شده نسبت به روش های معمولی OLEDB يا ODBC بيش از دو الی سه برابر می باشد.
از Data Reader استفاده کنيد.
اگر حجم بالائی از داده نداريد يا تنها می خواهيد از بانک اطلاعاتی عمل خواندن را انجام دهيد حتما از Data Reader استفاده کنيد. استفاده از Data Set سبب کندی کار و مصرف بالای منابع می گردد.
از Caching استفاده کنيد.
Caching شاهکار ASP.NET است. تا آنجائيکه ممکن است از caching استفاده کنيد. استفاده از caching سبب می شود تا از توليد مجدد کد HTML لازم برای يک صفحه تکراری جلوگيری شده و کاربر هم صفحات را خيلی سريعتر دريافت کند.
حالت Debug را غيرفعال کنيد.
هنگاميکه کار برنامه نويسی شما تمام شده است و زمان استفاده واقعی از برنامه فرا رسيده است، فراموش نکنيد که حالت Debug در کامپايل نهائی برنامه تان را غيرفعال نمائيد.
برگرفته از : دنیای اینترنت