عنوان
|
نويسنده
|
مشاهده
|
تعداد
آراء |
امتياز
|
State Management در ASP. NET 2.0 (بخش دوم) |
مديريت وب |
13050 |
10 |
4.5 |
با توجه به جایگاه داده در عصر حاضر و لزوم نگاه جامع به این مقوله مهم ، بر آن شدیم تا محوریت فعالیت های خود را بر روی این موضوع متمرکز نمائیم . از این رو گروه فابک با شعار فناوری اطلاعات برای کسب وکار شکل گرفت و خدمات خود را از طریق سایت www.fabak.ir به مخاطبان محترم عرضه می نماید
 |
State Management در ASP. NET 2.0
State Management در ASP. NET 2.0 (بخش
دوم)
در
بخش اول
به ضرورت مديريت state در برنامه های وب اشاره و در
ادامه به بررسی اولين گزينه موجود (view state )
پرداختيم .
در اين بخش با
نحوه ايمن سازی اطلاعات ذخيره شده در
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 ) در صورت عدم نياز به پتانسيل فوق و به منظور عدم تاثيرگذاری آن
بر روی كارآئی برنامه های وب ، ضرورتی به فعال كردن آن وجود ندارد .
در بخش سوم بحث بر روی State Management را ادامه داده و بررسی نحوه نگهداری
Member Variables و اشياء سفارشی در view state
خواهيم پرداخت .