بررسی كنترل های Validation در ASP.NET New Page 1



ساير




 

 

 

SAKHA RAVESH CO.

 ا مروز

 چهارشنبه  29  دی  1395  2017  Jan.  18   Wendesday ToDay
صفحه اصلی  مقالات نکته هادايره المعارف خودآموزها | تازه ها خود آزمون ها    
  نسخه قابل چاپ  

    5 4 3 2 1 

 عنوان

 نويسنده

  مشاهده

 تعداد آراء

 امتياز

 كنترل های Validation در ASP.NET ( بخش چهارم )

 مديريت وب

11543

9

3.1

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

 

كنترل های Validation در ASP.NET

كنترل های Validation در ASP.NET ( بخش چهارم )
 آنچه تاكنون گفته شده است :

  • بخش اول :  ماهيت و جايگاه كنترل های validation و بررسی عملكرد كنترل های <asp:RequiredFieldValidator> و <asp:RangeValidator> 
  • بخش دوم : بررسی عملكرد كنترل های <asp:CompareValidator> و <asp:CustomValidator>
  • بخش سوم : آشنائی با گروه های validation  و  بررسی عملكرد كنترل <asp:ValidationSummary>

در اين بخش به  بررسی برخی نكات خاص در خصوص ايمن سازی برنامه های وب با تمركز بر روی كنترل های Validation خواهيم پرداخت .  

تهديدات امنيتی در صورت عدم ارزيابی داده ورودی
برنامه های وب ، داده مورد نياز خود را از طريق درخواست های مبتنی بر پروتكل HTTP  دريافت می نمايند ( در برخی موارد ممكن است داده مورد نياز يك برنامه وب  از طريق يك فايل تامين گردد). با توجه به ماهيت پروتكل فوق ، مهاجمان می توانند هر بخشی از يك درخواست HTTP  نظير   url ، querystring ،  هدر ، كوكی ها ، فيلدهای موجود بر روی فرم و فيلدهای مخفی را تحريف تا ضمن ناديده گرفتن مكانيزم های امنيتی بكارگرفته شده در يك سايت ، آن را با مشكلات امنتيی متعددی مواجه نمايند. حملات forced browsing, command insertion, cross site scripting, buffer overflows, format string attacks و SQL injection نمونه هائی در اين زمينه می باشند . 
تعداد زيادی از برنامه های وب صرفا" از مكانيزم های سمت سرويس گيرنده به منظور بررسی و ارزيابی داده ورودی استفاده می نمايند . مهاجمان با استفاده از روش های متفاوتی می توانند مكانيزم های استفاده شده به منظور ارزيابی داده ورودی را ناديده گرفته و برنامه های وب را در مقابل داده ورودی مخرب خلع سلاح نمايند . مهاجمان ، بدين منظور می توانند با استفاده از ابزارهائی نظير telnet درخواست های HTTP را توليد نمايند . بديهی است در چنين مواردی نبايد انتظار داشت آنان واكنش هائی را كه مد نظر پياده كنندگان برنامه های وب در سمت سرويس گيرنده است ،‌ انجام دهند . با اين كه بررسی و ارزيابی داده ورودی در سمت سرويس گيرنده يك ايده عالی است و می تواند به عنوان يك اقدام مناسب در  جهت افزايش كارآئی برنامه های وب تلقی گردد ولی قطعا" رويكرد فوق دارای مزيت امنيتی خاصی نخواهد بود .
به منظور ارزيابی داده ورودی می بايست از روش های سمت سرويس دهنده استفاده گردد تا يك لايه دفاعی مناسب به منظور پيشگيری از درج داده مخرب توسط مهاجمان ايجاد گردد . پس از تحقق خواسته فوق ، می توان با دقت اقدام به بهينه سازی روش های استفاده شده به منظور بررسی و ارزيابی داده ورودی در سمت سرويس گيرنده نيز نمود تا ترافيك غيرضروری بر روی سرويس دهنده به حداقل مقدار ممكن برسد .

بررسی يك نمونه  
 در برخی موارد از داده ورودی در يك TextBox به منظور ايجاد يك query در ارتباط با يك بانك اطلاعاتی استفاده می گردد . روش فوق ، ممكن است مسائل و مشكلات امنيتی متعددی را به دنبال داشته باشد ( از عدم اجرای اسكريپت ها گرفته تا بروز اشكال در بانك اطلاعاتی ) . مجددا" لازم است به اين نكته مهم اشاره گردد كه كنترل های validation ، به منزله اولين لايه دفاعی در مقابل درج داده مخرب محسوب می گردند و اين اطمينان را ايجاد می نمايند كه صرفا" داده معتبر در اختيار ساير لايه های يك برنامه خصوصا" لايه داده آن قرار داده خواهد شد .
مهاجمان می توانند از طريق TextBox استفاده شده بر روی يك فرم ،‌ كدهای مخربی را به سيستم وارد نمايند كه حذف تمامی بانك اطلاعاتی را به دنبال داشته باشد . با اين كه همواره فرض پياده كنندگان برنامه های وب بر اين است كه از TextBox برای درج داده در سيستم استفاده خواهد شد ، ولی واقعيت اين است كه ممكن است از آنها برای درج كد نيز استفاده گردد . SQL injection يك نمونه از تهديدات موجود در اين زمينه است .

SQL Injection
فرض كنيد از يك TextBox برای درج داده بر روی يك فرم استفاده شده باشد و پس از درج داده توسط كاربر ، از آن به منظور بازيابی ركوردهائی خاص از يك بانك اطلاعاتی استفاده می گردد . بدين منظور ، از دستور SELECT به صورت زير استفاده شده است :

 SQLString = "SELECT * FROM MyTable WHERE MyKey = '" & MyTextBox.Text & "'"

دستور SELECT ، به صورت پويا از مقدار درج شده در TextBox استفاده می نمايد . ظاهرا" همه چيز درست است و مشكل خاصی وجود نخواهد داشت ولی فرض كنيد  كاربری كد SQL زير را در TextBox وارد نمايد :

   Search :    

پس از درج داده فوق در TextBox  ، وضعيت query نوشته شده در  برنامه به صورت زير خواهد بود :

 SELECT * FROM MyTable WHERE MyKey = ' ' ; DROP DATABASE MyDatabase

در چنين مواردی ، عبارت SQL شامل دو دستور مجزاء می گردد كه اولين دستور آن با توجه به ماهيت داده ورودی مقدار null خواهد بود و عملا" ركوردی را برنمی گرداند و دومين عبارت SQL ، باعث حذف يك بانك اطلاعاتی خواهد شد . بدين ترتيب يك SQL injection محقق می گردد و كد مخرب با داده مورد انتظار در عبارت SQL جايگزين می شود. با اين كه در يك بانك اطلاعاتی اكسس ، نمی توان چندين عبارت SQL را در يك خط استفاده نمود ولی برخی از سيستم های مديريت بانك های اطلاعاتی قادر به اجراء كد فوق خواهند بود .
پياده كنندگان برنامه های وب می توانند از كنترل های validation به منظور بلاك نمودن اينچنين كدهائی استفاده نمايند . بدين منظور می توان طول رشته ورودی ، نوع داده ورودی و يا وجود داده ورودی در يك محدوده خاص را بررسی نمود . تست های فوق در مواردی كه داده ورودی از نوع string و با طول نامشخص باشند ، كارساز نبوده و نمی توان از كنترل های اشاره شده در جهت ايجاد يك سطح حفاظتی مناسب استفاده نمود . 

راه حل چيست ؟ 
بهترين روش برای حفاظت در مقابل ورود كدهای مخرب به سيستم ، استفاده از عبارات SQL به صورت پارامتريك در مقابل بكارگيری مستقيم داده ورودی است . پارامترها ، مكان لازم برای نگهداری مقادير داده را فراهم نموده و اين اطمينان را ايجاد می نمايند كه از مقادير ورودی مستقيما" در كد استفاده نخواهد شد . 
در كد زير از يك عبارت SELECT به منظور بازيابی ركوردهائی خاص از جدول Books در بانك اطلاعاتی BooksDB استفاده شده است . عبارت SQL به عنوان خصلت SelectCommand كنترل منبع داده AccessDataSource ( با " id="BookSource ) در نظر گرفته شده است .

 Sub Get_Record (Src As Object, Args As EventArgs)

  Dim SQLString As String
  SQLString = "SELECT BookID, BookTitle, BookPrice FROM Books" & _
                     "
WHERE BookID = @BookID"
  BookSource.SelectCommand = SQLString

End Sub

يك پارامتر با استفاده از نام خود كه به دنبال يك كاراكتر "@" می آيد ( در اين مثال BookID @  ) ، مشخص می گردد و يك مرجع به داده ورودی است كه در عبارت SELECT و به منظور بازيابی ركوردهای مورد نظر استفاده می گردد . فرض كنيد ، كاربر داده زير را در TextBox وارد نمايد :

  Book ID :    

مقدار ورودی در TextBox ، به عنوان مقدار پارامتر BookID @   در عبارت SELECT در نظر گرفته می شود . در چنين مواردی ، می بايست با صراحت مقدار درج شده در TextBox را با پارامتر فوق مرتبط نمود . زمانی كه از كنترل AccessDataSource به منظور بازيابی داده از يك بانك اطلاعاتی استفاده می گردد ، برای مشخص كردن پارامترهای مورد نياز در يك عبارت SELECT ، می بايست از بخش <SelectParameters>   در كنترل استفاده گردد . در اين بخش می توان از يك و يا چندين كنترل <asp:ControlParameter> استفاده نمود . با استفاده از كنترل <asp:ControlParameter> ، می بايست يك نام را برای پارامتر در نظر گرفت .همچنين ، لازم است كنترلی كه قرار است مقدار آن به عنوان پارامتر در نظر گرفته شود نيز مشخص گردد.
كد زير نحوه استفاده از پارامتر BookID @  در كنترل AccessDataSource را نشان می دهد .

 Book ID:
  <asp:TextBox id="BookIDInput" Runat="Server"/>
  <asp:Button Text="Find" OnClick="Get_Record" Runat="Server"/>

  <asp:AccessDataSource id="MySource" Runat="Server" DataFile="../DB/BooksDB.mdb">
     <SelectParameters>
         <asp:ControlParameter Name="BookID" ControlID="BookIDInput" PropertyName="Text"/>
     </SelectParameters>
</asp:AccessDataSource>

توضيحات :

  • كنترل  <asp:ControlParameter>  از سه خصلت به منظور ايجاد ارتباط با كنترلی كه داده مورد نياز را تامين خواهد كرد ، استفاده می نمايد .

  • خصلت Name ، نام در نظر گرفته شده برای پارامتر را كه از آن در عبارت SELECT استفاده خواهد شد را مشخص می نمايد .

  • خصلت ControlID ، شناسه (id ) كنترلی است كه داده مورد نياز برای پارامتر را مشخص می نمايد .
     

  • PropertyName ، خصلت كنترلی است كه از مقدار آن به عنوان مرجع استفاده می گردد ( در اين مثال خصلت Text مربوط به كنترل TextBox ) .
     

  • در مثال فوق از يك پارامتر در عبارت SELECT استفاده شده است ، بنابراين به يك كنترل  <asp:ControlParameter> نياز می باشد. در صورتی كه لازم است از چندين پارامتر استفاده شود ، می بايست برای هر يك از آنها از يك كنترل <asp:ControlParameter> استفاده گردد .

سادگی كد نويسی
با پارامتر درج شده در يك عبارت SELECT به عنوان يك مقدار داده literal برخورد می شود . بنابراين ، بر خلاف زمانی كه از رشته های متصل شده به هم به منظور بكارگيری يك عبارت SQL استفاده می گردد ، احتمال درج داده مخرب بطرز مشهودی كاهش خواهد يافت . استفاده از پارامتر در عبارات SQL ، كاهش پيچيدگی كدينگ عبارات SQL را نيز به دنبال خواهد داشت .
كد زير يك نمونه عبارت SQL را نشان می دهد كه در آن از يك رشته متصل شده به هم استفاده شده است :

 SQLString = "SELECT * FROM Books WHERE " & _
         "BookType = '" & TypeTextBox.Text & "' AND " & _
         "BookPrice > " & PriceTextBox.Text & " AND " & _
         "BookQty <= " & QtyTextBox.Text & " AND " & _
         "BookTitle LIKE '%" & TitleTextBox.Text & "%'"

كد فوق را می توان با عبارت زير جايگزين نمود :

 SQLString = SELECT * FROM Books WHERE " & _
        "BookType = @BookType AND BookPrice > @BookPrice AND " & _
        "BookQty <= @BookQty AND BookTitle LIKE @BookQty"

درون كنترل AcessDataSource ، می بايست از يك بخش SelectParameters به منظور معرفی كنترل هائی كه مقدار مورد نياز هر يك از پارامترها را تامين می نمايند ، استفاده گردد .



جستجو

مقالات                 
دايره المعارف       
دوره های آموزشی


 

 

مشاهده گروه ها



              

 

 تهيه شده در شرکت سخا روش -  1382