ViewState چیست ؟

  

 

   یکی از راه کارهایی که در State Management  در ASP.NET مطرح می شود ViewState  است .

در State Management سعی بر این است که داده هایی که در حال حاظر برای کاربر در حال نمایش است ،در پست بک های بعدی (PostBack) حفظ شود تا سرور مجبور به ارسال مجدد و بی مورد داده های اساسی نشود . برای رفع این مشکل راه حل های زیادی وجود دارد . یکی از این راهها استفاده از View State  است .


به طور پیش فرض کنترل های ASP.NET   برای حفظ اطلاعات خود در بین PostBack ها از ViewState  استفاده می کنند . اگر دقت کرده باشید وقتی یک برچسب (Label) را در صفحه ASP.NET  قرار می دهید و مقداری به آن می دهید حتی اگر صفحه چند بار PostBack شود باز همان مقدار در Label باقی خواهد ماند و این به دلیل استفاده Label از ViewState است .

همچنین برای نگهداری اطلاعات هر نوع کنترول HTML ازنوع ورودی (Input) ، در هنگام PostBack ها از این روش استفاده می شود .

ASP.NET  درست قبل از آن که همه  تگ های ASP.NET را به HTML  تبدیل کرده و آن را برای کلاینت بفرستد، اقدام به قراردان ViewState به صورت یک فیلد پنهان (Hidden  Field)  می کند . اگر سورس صفحه(Page Source)  را نگاه کنید فیلدی به این صورت در کد HTML آن وجود دارد :


< input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTA0NTgwNjUyNGRkqXCar5V5XFunVK9Zpp+Jw047qpo=" />


مقدار این رشته (ViewState) که در واقع همان اطلاعات مورد نظر ما است به صورت یک رشته در پایه 64 (String Base64) در آمده است . این رشته توسط انسان قابل خواندن نیست ولی اگر یک نفر بخواهد از این رشته سر در بیاورد و آن را بخواند ، به راحتی می تواند این رشته را دستکاری کرده و آن را بخواند .


Byte[]  stringByte = Convert.FromBase64String(Our ViewState String);
String  decodedViewState = System.Text.Encoding.ASCII.GetString(stringByte);

تکه کد بالا به راحتی ViewState را برای ما قابل خواندن می کند . و این مساله به خوبی نشان می دهد که ViewState روش مناسبی برای نگهداری اطلاعات حساس و مهم نیست چون به راحتی قابل شناسایی شدن است . حتی یک نفوذ کننده به سایت شما (Hacker) می تواند اطلاعات ViewState را جهت منافع خود تغییر داده و دوباره این مقدار جدید  را در ViewState قرار داده و برای سرور ارسال کند . برای رفع این مشکل امنیتی 2 راه حل وجود دارد .

راه حل اول استفاده از Hash Code  است  که در این روش اطلاعات ViewState در هنگام ارسال مجدد به سرور ،توسط CheckSum (مجموع مقابله ای) کنترل می شود که با مقدار اولیه آن تفاوت نداشته باشد و اگر مقدار آن تغییر کرده باشد ،درخواست شما با نشان داده شدن یک پیغام از طرف سرور  رد (Refuse) می شود و هیچ کاری انجام نمی شود . این امکان به صورت پیش فرض در ASP.NET  فعال است. این روش خوبیست اما هنوز اطلاعات ViewState به همان روشی که ذکر شد قابل خواندن است . 

راه حل دوم رمز کردن مقدار ViewState  است که دیگر کاربر نتواند مقدار ViewState را بفهمد .(البته این روش توصیه نمی شود مگر درمواقع ضروری، زیرا با این کار در هر PostBack باید عمل رمز کردن و رمز گشایی توسط سرور انجام شود و این می تواند کارایی سرور را پایین بیاورد )

با همه  این اوصاف ViewState روش بسیار مناسبی برای ذخیره کردن اطلاعات غیر محرمانه ولی مهم است . زیرا مقادیر ViewState طرف کلاینت (کاربر) ذخیره می شود و نیازی به ذخیره آن در سرور نیست و حافظه سرور بی مورد از بین برده نمی شود .

منابع

Pro ASP.NET in C# 2005 - Matthew Macdonald & Mario SZPUSTA