ViewState ve Güvenliği

ASP.NET ile uygulama geliştirmiş kişiler ViewState ile mutlaka tanışmışlar ve bir fikirleri olmuştur. Bu makalede ViewState’in aslında ne olup ne olmadığını hangi amaçlar için kullanılması gerektiğini ve nasıl daha verimli bir şekilde kullanılabileceğini anlatacağım biraz daha üst seviyede anlatacağım.

ViewState Ne Değildir?
İlk olarak ViewState’in ne olmadığını anlatalım. ViewState’in post edilen değerlerin form kontrollerine tekrar yerleştirilmediğine dair yanlış anlamalar vardır. Bunu görmek için en basit yol sayfanızdaki viewstate kontrollerini disable etmeniz ve bu web kontrollerin değerlerinin tekrar yerine konulup konulmadığını seyretmenizdir. Bu web kontrolleri sadece sayfa ilk yüklenirken (!Page.IsPostBack) yaratılmasına rağmen, sayfadaki web kontollerinin değerlerinin sayfa postback edilirken de yerine konulması otomatik olarak yapılır. Sayfadaki web kontrollerinin değerlerinin tekrar yerine otomatik olarak konulması ViewState’in yaptığı tek şey değildir.

ViewState kod içerisinde dinamik olarak yaratılan herhangi bir kontrolü tekrar otomatik olarak yaratmaz. Kod içerisinde dinamik olarak yarattığınız bu kontrolü kullanmak istiyorsanız kod içerisinde tekrar yaratmalısınız. Eğer bu tip bir kod yazdıysanız bu işlem biraz zor olabilir, özellikle bir event içinde yarattıysanız. Fakat bu, her Load sırasında daha önce yaptığınız veya tekrar yarattığınız dinamik kontrolün bilgisini ViewState’de tutarak yapılabilir. Fakat bunu manuel olarak kod içerisinde yapmalıyız.

Sonuç olarak, ViewState sizin için veya oturum verileri (Session Data) veya sayfalar arası veri transferleri için değildir. ViewState sadece o anki sayfayla ilgili olan durum datası ve sayfanın çeşitli kontrolleri için dizayn edilmiştir. Herhangi bir durumda ViewState yeni bir sayfaya yollanamaz, redirect edilemez veya server transfer yapılamaz. Eğer bir çok sayfa arasında veri transferi yapmak istiyorsanız, Cookie ya da Session nesnelerini kullanabilrisiniz. Ama ViewState’lerin amacı bu değildir. ViewState birazdan göreceğiniz gibi güvenli değildir ve sistem kaynaklarını verimli kullanabilmek için en iyi yöntem değildir.


ViewState Nedir?
ViewState sayfada bulunan web kontrollerinin değerlerini tekrar yerine koymak veya bu değerleri izlemek için kullanılır. Bu değerler form ile birlikte post edilmediği için ya da bu web kontolleri HTML sayfası içinde olmadığından kaybolurlar. Bu herhangi bir kontolün tamamiyle HTML içinde tanımlandığı anlamına gelir. Eğer kod içerisinde bu kontroller üzerinde bir değişiklik yapmayacaksak ViewState’e ihtiyacımız da olmaz. ViewState sadece herhangi bir şekilde kod içerisinde, data-binding’de ya da kullanıcı etkileşimlerinde dinamik olarak değişen bu kontollerin değerlerini tutar.

Böylece ViewState kod içerisinde yaptığınız değişikliklerin özelliklerini, kontole bağladığınız datayı ya da PostBack işlemi ile birlikte kullanıcının yaptığı işlemler sonucunda ortaya çıkan yeni durumun bilgisini tutar. Örnek olarak, kullanıcı sayfanın PostBack olmasına neden olacak Calendar nesnesinden bir değeri seçsin. Seçim yapıldıktan sonra ortaya çıkan calendar’ın yeni özellikleri yeniden yerine konulana kadar Calendar’ın ViewState’inde tutulacaktır, fakat özellikler bir dahaki sefere post edilmeyecektir.

ViewState’in Formatı
ViewState sayfa içinde __VIEWSTATE adında gizli bir form elemanı olarak yer alır. Bu gizli form elemanının değeri Base64 ile kodlanmıştır bu yüzden okunabilirliği kolay değildir. Base64 ile kodlanmıştır ama şifrelenmemiştir.Bu iki kavram karıştırılmamalıdır. __ViewState’de tutulan bilgileri Machine.config dosyasında, Web.config dosyasında veya sayfa düzeyinde “enableViewStateMac” özelliğini değiştirerek şifrelenmesini sağlayabilirsiniz.

machine.config or web.config:
page level directive:
page level script code: Page.EnableViewStateMac = false;

__ViewState’deki bilgileri isteğe bağlı olarak değişik şekillerde şifreleyebilirsiniz. Bunu Machine.config dosyasındaki machineKey’in validation değerini değiştirerek yapabilirsiniz. Eğer validation değerine yazdığınız string ifadesine göre ViewState’deki bilgilerin şifrelenmesini istiyorsanız enableViewStateMac özelliğinin ”true” olarak değiştirilmesini unutmayın.

machine.config:

Fakat makine seviyesinde bu ayarın yapılması daha fazla kaynak kullanımını doğurur bu da tavsiye edilmeyen bir durumdur.

Yukarıdakiler ek olarak; ViewState render işlemi yapılmadan önce Page.SavePageStateToPersistenceMedium metodu ile kaydedilir ve PostBack işlemi sırasında Page.LoadPageStateFromPersistenceMedium metodu ile tekrar sayfaya yüklenir.

protected override object LoadPageStateFromPersistenceMedium()
{
return Session["ViewState"];
}
protected override void SavePageStateToPersistenceMedium(object viewState)
{
Session["ViewState"] = viewState;
// Session’a atasanız bile sayfada hidden olarak __ViewState bulunmalıdır.
RegisterHiddenField("__VIEWSTATE", "");
}

Bu iki metot kolay bir şekilde override edilerek Session’a atılabilir. Bu yöntem default olarak Session kullanan mobil araçlarda daha az bandwith’in kullanılması gerektiği durumlarda yararlı olur. Diğer veri ambarlarında database, gelişmiş Session yöntemleri gibi, ViewState’i saklamak için özel LosFormatter sınıfını kullanarak seralization and deserialization işlemlerini gerçekleştirmek gerekir.

protected override object LoadPageStateFromPersistenceMedium()
{
LosFormatter format = new LosFormatter();
return format.Deserialize(YourDataStore["ViewState"]);
}
protected override void SavePageStateToPersistenceMedium(object viewState)
{
LosFormatter format = new LosFormatter();
StringWriter writer = new StringWriter();
format.Serialize(writer, viewState);
YourDataStore["ViewState"] = writer.ToString();
}

KAYNAK : http://aspalliance.com/articleViewer.aspx?aId=135&pId=


http://www.aspnedir.com/Article/DisplayArticle.aspx?ID=603

search this blog (most likely not here)