hayal et, tasarla, hayata geçir



Querystring Hash Yöntemi

Querystring sayfalar arasında veri göndermemizi sağlayan durum yönetimi kavramlarından birisidir. Her ne kadar kullanımı basit ve kullanışlı olsa da gönderilen verinin son kullanıcıya görünmesi ve kullanıcıların kolaylıkla bu veri üzerinde değişiklik yapabilmesi querystring için bir dezavantajdır. Tabi ki querystring ile gönderilen bir veri önemliyse ve kullanıcı tarafından görünmemesi gerekiyorsa mutlaka session gibi başka yöntemler tercih edilmelidir. Fakat bazı durumlarda Querystring ile giden verinin görülmesi sorun yaratmasada kullanıcıların bu veriyi değiştirmesi sıkıntı yaratabilir. Bu gibi durumları önlemek için Querystring’i hashleme yöntemini kullanırız.

Temel mantığı Querytsring’i hashleyip tekrar Querystring üzerinde bir parametre üzerinde göndererek diğer sayfada kontrol etmektir. Örnek vermek gerekirse normalde göndereceğimiz querystring şu şekilde olabilir;

***.aspx?Id=20

Fakat kullanıcı 20 sayısını değiştirip sayfa üzerinde farklı işlemler yaptırabilir. Yapmamız gereken Id=20 kısmını hashleyip querystring’e eklemektir.

***.aspx?Id=20&v=-1160399018

Burada Id=20 key-value ikilisinin hash kodu alınarak v parametresi ile tekrar querystring e eklenmiştir. Diğer sayfada ise tekrardan göndermek istediğimiz kısmın hash kodunu alarak bu hash kodu ile karşılaştırdığımız vakit querystring in değişip değişmediğini anlayabiliriz. Bir diğer değişle diğer sayfada da ‘v’ parametresini görmezden gelerek aynı işlemi yaparız ve ‘v’ parametresindeki hash kod ile karşılaştırırız. Eğer iki değer aynı ise Querystring değişmemiş demektir. Ayrıca hash algoritmaları asimterik olduğundan yani tekrar çözülebilir olmadıklarından dolayı da bu kod herhangi bir şekilde açılıp bakılmaz.

Şimdi bu işlemi kod tarafında nasıl yaptığımıza bir bakalım. Öncelikle yönlendirme işleminden önce Querystring’in hash kodunu alalım ve sonuna ekleyelim;

protected void Page_Load(object sender, EventArgs e)
{
    Response.Redirect("Default2.aspx?" + HashQueryString("Id=20"));
}

private static string salt = "hashKey";

public static string HashQueryString(string queryString)
{
       string hashedString = salt + queryString + salt;
       hashedString = hashedString.GetHashCode().ToString();

       return queryString + "&v=" + hashedString;
}

Yukarıda ek olarak bir de salt kullanılmıştır. Bu kodun amacı aynı yöntemi izleyen kişilerin kodu kırmasını önlemektir. Kod tarafında belirleyeceğiniz bir değişkeni son kullanıcı bilemeyeceği için güvenlik arttırılmış olur.

Şimdi ise diğer sayfada bu querystring nasıl parse edilir ona bakalım;

protected void Page_Load(object sender, EventArgs e)
{
   if (CheckHashedQueryString(Request.QueryString))
   {
       //querystring değişmemiştir
   }
}

public static bool CheckHashedQueryString(NameValueCollection queryString)
{
    string baseQueryString = String.Empty;
    string hashedString = String.Empty;

    string[] queryStringArray = queryString.ToString().Split(new string[] { "&v=" }, StringSplitOptions.None);

    baseQueryString = queryStringArray[0];
    hashedString = "&v=" + queryStringArray[1];

    if (HashQueryString(baseQueryString) == baseQueryString + hashedString)
    {
        return true;
    }
    else
    {
        return false;
    }
}

Diğer sayfada ise yukarıdaki kod parçası kullanılarak Querystring’in güvenilirliği test edilmiş olur. Böylelikle her ne kadar veri kullanıcıya gösterilmiş olsa da diğer sayfada Querystring’in değişmediğinden emin olabiliriz…



1 Yorum


  1. Durum Yönetimi ve Farkları | Serkan Yazıcıoğlu

    [...] Kullanıcının içerisindeki veriyi değiştirmesi sorun yaratıyorsa Querystring hash yöntemi [...]

    Tem 16, 2009 @ 08:35

Yanıtla



SON YAZILARIM

genel
Microsoft Türkiye Açık Akademi

Microsoft tarafından Türkiye'deki ilk ücretsiz online yazılım okulu Açık Akademi açıldı....

genel
Windows Azure Blob Arayüzü

Bir önceki yazımızda Blob servisine kısa bir giriş yapmıştık. Yazıyı okumak isterseniz

genel
Windows Azure Blob Servisi

Microsoft'un bulut mimarisi Windows Azure platformu üzerinde veri altyapısı alışıla gelmiş yöntemlerden...