Makale Özeti

Şimdi kendimizi site sahibi yerine koyalım ve düşünelim. Site sahibi olarak kullanıcıların queryString üzerinde elle değişiklik yaparak sayfalara ulaşmasını istemiyorum.Bunun için nasıl bir önlem alabilirim ? Bu arada Tamper Proof kurcalamaya dayanıklı anlamına gelmektedir.

Makale

Daha önceki makalede html parse işlemini göstermiştim. Orada queryString’de bulunan page değişkenini sürekli artırarak sayfalar arasında dolaşıyordum. Yani ekstra çaba harcamadan sayfalarda gezinip verileri elde ediyordum. Şimdi kendimizi site sahibi yerine koyalım ve düşünelim. Site sahibi olarak kullanıcıların queryString üzerinde elle değişiklik yaparak sayfalara ulaşmasını istemiyorum.Bunun için nasıl bir önlem alabilirim ? Bu arada Tamper Proof kurcalamaya dayanıklı anlamına gelmektedir.

Hemen basit bir senaryo gerçekleştirelim. Anasayfa ve Hesapla sayfalarımız var. Anasayfada girilen 2 sayıyı queryString ile Hesapla sayfasına iletip orada hesaplatmak istiyorum.

1
2
3
4
5
6
7
8
9
10
11
12
public partial class Anasayfa : System.Web.UI.Page
    {
        protected void btnSum_Click(object sender, EventArgs e)
        {
            NameValueCollection queryString = HttpUtility.ParseQueryString(string.Empty);
             
            queryString["ilkSayi"] = txtFirst.Text;
            queryString["ikinciSayi"] = txtSecond.Text;
 
            Response.Redirect("Hesapla.aspx?" + queryString.ToString());
        }
    }
1
2
3
4
5
6
7
8
9
10
11
12
public partial class Hesapla : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            var ilkSayi = Request.QueryString["ilkSayi"].ToString();
            var ikinciSayi = Request.QueryString["ikinciSayi"].ToString();
 
            var toplam = Int32.Parse(ilkSayi) + Int32.Parse(ikinciSayi);
            Response.Write("Sayıların toplamı = " + toplam);
 
        }
    }

1

Hesapla sayfasında sayıları tarayıcı üzerinden değiştirdiğimde yeni değeri hesaplıyor.Fakat ben bunu istemiyorum.
Buna çözüm olarak yapacağımız şey gelen parametreleri belli bir değere göre şifrelemek. Sonrasında bu şifreyi yine queryString ile hesapla sayfasına iletmek. Burada değerler tekrar kontrol edilecek ve şifreler uyuşuyorsa işlem gerçekleşecektir. Örnekte ilk ve ikinci sayıyı yan yana koyup öyle hash oluşturuyorum. Bunu istediğiniz gibi değiştirmek size kalmış.

1
2
3
4
5
6
7
8
9
10
11
12
13
protected void btnSum_Click(object sender, EventArgs e)
        {
            NameValueCollection queryString = HttpUtility.ParseQueryString(string.Empty);
             
            queryString["ilkSayi"] = txtFirst.Text;
            queryString["ikinciSayi"] = txtSecond.Text;
 
            string hashValue = HashHelper.ComputeHash(txtFirst.Text + txtSecond.Text);
 
            queryString["hash"] = hashValue;
 
            Response.Redirect("Hesapla.aspx?" + queryString.ToString());
        }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public partial class Hesapla : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            var ilkSayi = Request.QueryString["ilkSayi"].ToString();
            var ikinciSayi = Request.QueryString["ikinciSayi"].ToString();
            var hash = Request.QueryString["hash"].ToString();
 
            var computeHash = HashHelper.ComputeHash(ilkSayi + ikinciSayi);
 
            if (hash == computeHash)
            {
                var toplam = Int32.Parse(ilkSayi) + Int32.Parse(ikinciSayi);
                Response.Write("Sayıların toplamı = " + toplam);
            }
            else
            {
                Response.Write("QueryString üzerinde oynama yapmayınız <img src="http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif?m=1129645325g" alt=":)" class="wp-smiley"> ");
            }   
        }
    }

HashHelper sınıfımız

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public static class HashHelper
    {
        public static string ComputeHash(string data)
        {
            string key = "gangnamStyle";
            byte[] keyBytes = Encoding.ASCII.GetBytes(key);
             
 
            byte[] dataBytes = Encoding.UTF8.GetBytes(data);
 
            HMACSHA1 algorithm = new HMACSHA1(keyBytes);
 
            byte[] hash = algorithm.ComputeHash(dataBytes);
 
            return ByteArrayToHexString(hash);
 
        }
 
        public static string ByteArrayToHexString(byte[] bytes)
        {
            StringBuilder sb = new StringBuilder();
            foreach (byte b in bytes)
            {
                sb.AppendFormat("{0:x2}", b);
            }
            return sb.ToString();
        }
    }

Artık anasayfadan bizi hesapla sayfasına yönlendirirken hash parametresinide ekliyor.

2

Değerler üzerinde elle değiştirme yaptığımız zaman hatayla karşılaşıyoruz.

3