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); } } |
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.
Değerler üzerinde elle değiştirme yaptığımız zaman hatayla karşılaşıyoruz.
Kaynak : yazgelistir.com