
یکی از راه کارهایی که در 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