analiz 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

ajax
UserControl, UpdatePanel ve RegisterPostBack Sorunu

ASP.NET AJAX ile gelen sorunlardan biri de UpdatePanel içerisinde bazı durumlarda ajax postback yerine full...

yazılım
Ofis Savaşları

IT'ciler ile satış takımı arasında hep bir anlaşmazlık vardır. Genelde satış takımının...

yazılım
Çevre Faktörü

Yazılım projelerinin en önemli süreci tabi ki geliştirme aşamasıdır. Uygulama yazılır, yazıldıkça...