0

ايمن سازی اطلاعات ذخيره شده در View State - بخش اول

 
mohamadaminsh
mohamadaminsh
کاربر طلایی1
تاریخ عضویت : دی 1389 
تعداد پست ها : 25772
محل سکونت : خوزستان

ايمن سازی اطلاعات ذخيره شده در View State - بخش اول

 

 نویسنده :  www.srco.ir    86.10.05     542 بار مشاهده  

در اين بخش با نحوه ايمن سازی اطلاعات ذخيره شده در view state آشنا خواهيم شد .
اطلاعات view state در يك رشته درهم آميخته مشابه زير ذخيره می گردد .
 
<input type="hidden"
name="__VIEWSTATE"
value="/wEPDwUKMTUyMzMyNzc3NGRklXVE/6qqfC5AWkr1Yw0Xu5IpHg0="
/>

به موازات اضافه كردن اطلاعات بيشتر به view state ، طول اين رشته طولانی تر خواهد شد . با توجه به اين كه مقدار ذخيره شده در رشته فوق به صورت متن شفاف نمی باشد ، بسياری از برنامه نويسان ASP.NET بر اين باور هستند كه داده ذخيره شده در view state به صورت رمز شده است .ولی واقعيت اينچنين نيست . در واقع ، اطلاعات view state به سادگی در حافظه به يكديگر متصل شده و به يك رشته Base64 تبديل می شوند .يك هكر باهوش می تواند با استفاده از مهندسی معكوس رشته فوق ، view state را بررسی و از اطلاعات ذخيره شده در آن به سرعت آگاه گردد .
كد زير نحوه رمز كردن يك رشته معمولی را به يك رشته Base64 نشان می دهد .
 
Private Function EncodeBase64(ByVal input As String) As String
Dim strBytes() As Byte = System.Text.Encoding.UTF8.GetBytes(input)
Return System.Convert.ToBase64String(strBytes)
End Function

كد زير نحوه رمز گشائی يك رشته Base64 را به يك رشته معمولی نشان می دهد .
 
Private Function DecodeBase64(ByVal input As String) As String
Dim strBytes() As Byte = System.Convert.FromBase64String(input)
Return System.Text.Encoding.UTF8.GetString(strBytes)
End Function

در صورتی كه لازم است اطلاعات ذخيره شده در view state دارای ايمنی بيشتری باشند از دو گزينه مختلف می توان استفاده كرد :
گزينه اول : به ASP. NET اعلام شود كه از يك hash code استفاده نمايد. برخی اوقات از hash code به عنوان يك checksum قدرتمند پنهانی نيز ياد می شود . در چنين مواردی ، ASP. NET تمامی داده ذخيره شده در view state را بررسی و يك الگوريتم hashing را بر روی آن اعمال می نمايد . الگوريتم فوق يك سگمنت كوتاه از داده را ايجاد می نمايد كه در واقع همان hash code است . در ادامه ، كد فوق به انتهای داده ذخيره شده در view state اضافه می گردد .
زمانی كه صفحه post back می گردد ، ASP. NET داده موجود در view state را بررسی و مجددا" hash code را با استفاده از فرآيندی مشابه توليد می نمايد . در ادامه مقدار محاسبه شده با مقدار موجود در رشته مقايسه می گردد تا اين اطمينان حاصل شود كه داده ذخيره شده در view state تغيير نكرده باشد .
در صورتی كه يك كاربر بدانديش بخشی از داده موجود در view state را تغيير دهد ، ASP. NET يك hash code را توليد خواهد كرد كه با كد ذخيره شده در انتهای view state مطابقت نخواهد كرد . در صورت تحقق چنين شرايطی ، postback بطور كامل ناديده گرفته خواهد شد .
شايد در ذهن شما اين موضوع مطرح شده باشد كه يك كاربر باهوش می تواند با بكارگيری ترفندهائی بر مشكل اشاره شده غلبه كرده و علاوه بر توليد اطلاعات نادرست ، يك hash code مناسب و منطبق بر اطلاعات ذخيره شده در view state را نيز توليد نمايد . در پاسخ می بايست به اين نكته اشاره كرد كه كاربران بدانديش قادر به توليد hash code صحيح نخواهند بود چراكه آنان دارای كليد رمزنگاری مشابه ASP. NET نمی باشند . اين بدان معنی است كه hash code توليد شده با وضعيت موجود نمی تواند مطابقت نمايد .
hash code بطور پيش فرض فعال است . بنابراين در صورت تمايل به استفاده از پتانسيل فوق ، لازم نيست كه مراحل اضافه ای را دنبال نمود . در برخی موارد پياده كنندگان ويژگی فوق را غيرفعال می نمايند تا از مشكلات احتمالی موجود در يك web farm پيشگيری نمايند . در چنين وضعيتی ، سرويس دهندگان مختلف دارای كليدهای مختلفی می باشند و مشكل زمانی اتفاق می افتد كه پس از post back صفحه ، يك سرويس دهنده جديد آن را دريافت نمايد .
در يك محيط web farm كليد می بايست در بين تمامی سرويس دهندگان يكسان باشد . در صورتی كه كليد يكسان نباشد و صفحه برای يك سرويس دهنده متفاوت با سرويس دهنده ای كه صفحه را ايجاد كرده است ، post back گردد ، يك خطاء ايجاد خواهد شد .بنابراين در يك محيط web farm ، می بايست پياده كنندگان يك كليد را در فايل Machine.config مشخص نمايند ( در مقابل اين كه به ASP.NET اجازه داده شود كه اين كليد را بطور اتوماتيك ايجاد نمايد) .
برای غيرفعال كردن hash codes ، می بايست از خصلت enableViewStateMac عنصر <pages> در فايل web.config و يا machine.config به صورت زير استفاده كرد .
 
<configuration >
<system.web>
<pages enableViewStateMac="false" />
...
</system.web>
</configuration>

گزينه دوم : با ايجاد يك كد hash ، فريمورك ASP. NET اين موضوع را بررسی خواهد كرد كه آيا داده ذخيره شده در view state دستكاری شده است ؟ علی رغم ايجاد اين لايه امنيتی ، داده موجود در view state همچنان قابل مشاهده توسط كاربران بدانديش خواهد بود .
در صورتی كه بر روی داده ذخيره شده در view state حساسيت زيادی وجود داشته باشد و بخواهيم امنيت آن را افزايش دهيم ، می بايست رمزنگاری view state را فعال كرد . برای فعال كردن ويژگی فوق از خصلت ViewStateEncryptionMode به همراه دايركتيو page استفاده می گردد .
 
<%@Page ViewStateEncryptionMode="Always" %>

در صورت تمايل می توان از خصلت فوق در فايل پيكربندی نيز استفاده كرد .
 
<configuration >
<system.web>
<pages viewStateEncryptionMode="Always" />
...
</system.web>
</configuration>

به خصلت ViewStateEncryptionMode يكی از مقادير زير را می توان نسبت داد :
• Always : همواره رمزنگاری انجام می شود .
• Never : رمزنگاری انجام نخواهد شد .
• Auto : رمزنگاری صرفا" در مواردی كه يك كنترل با صراحت آن را درخواست نمايد ، انجام خواهد شد .
گزينه پيش فرض Auto است . اين بدان معنی است كه يك كنترل با فراخوانی متد Page.RegisterRequiresViewStateEncryption رمزنگاری را درخواست می نمايد . در صورتی كه يك كنترل به دليل عدم داشتن اطلاعات حساس از متد فوق استفاده نكند ، view state رمز نخواهد شد و عمليات بيشتری جهت رمزنگاری به سيستم تحميل نخواهد شد . به عبارت ديگر ، يك كنترل زمانی می تواند دل خود را به خدمات ارائه شده توسط متد فوق خوش نمايد كه مقدار خصلت viewStateEncryptionMode ، معادل Auto در نظر گرفته شده باشد . در صورتی كه مقدار خصلت فوق Never در نظر گرفته شده باشد ، به درخواست كنترل ها جهت رمزنگاری پاسخ داده نخواهد شد.
با توجه به اين كه رمزنگاری عمليات بيشتری را به سرويس دهنده وب تحميل می نمايد ( هم در زمان رمزنگاری و هم در زمان رمزگشائی پس از هر post back ) در صورت عدم نياز به پتانسيل فوق و به منظور عدم تاثيرگذاری آن بر روی كارآئی برنامه های وب ، ضرورتی به فعال كردن آن وجود ندارد .

کریمی که جهان پاینده دارد               تواند حجتی را زنده دارد

 

دانلود پروژه و کارآموزی و کارافرینی

چهارشنبه 24 خرداد 1391  7:07 PM
تشکرات از این پست
دسترسی سریع به انجمن ها