ASP.NET / QueryString Güvenliği TamperProof

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=":)"> ");
            }   
        }
    }

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

 

Kaynak : yazgelistir.com

You may also like...

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.