Asp.net QueryString güvenliği

Artık internet üzerinde statik web siteleri yok denecek kadar az miktarda.Oluşturduğumuz dinamik web sitelerinde sayfalar arasındaki geçişlerde veri taşımak için en sık kullanılan yöntem querystring.Gönderdiğimiz querystringler kullanıcı tarafından adres çubuğunda görüntülenmekte.Peki kullanıcının bu querystring değerler üzerine oynama yapmasını nasıl engelleyebiliriz?

Küçük bir senaryo ile querystring ile gönderdiğimiz 2 sayıyı toplama işlemi yapalım.

public partial class Default: System.Web.UI.Page
{
protected void btnTopla_Click(object sender, EventArgs e)
{
NameValueCollection queryString = HttpUtility.ParseQueryString(string.Empty);
 
queryString["sayi1"] = txtSayi1.Text;
queryString["sayi2"] = txtSayi2.Text;
 
Response.Redirect("Topla.aspx?" + queryString.ToString());
}
}

Kullanıcıdan textbox kontrolü ile 2 sayi girmesini istedik,ve topla butonuna bastığında bu sayıları querystring olarak Topla.aspx sayfasına gönderdik

public partial class Topla: System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
var ilkSayi = Request.QueryString["sayi1"].ToString();
var ikinciSayi = Request.QueryString["sayi2"].ToString();
 
var Sonuc= Int32.Parse(ilkSayi) + Int32.Parse(ikinciSayi);
Label1.text="Toplam = " + sonuc;
 
}
}

Topla.aspx sayfasına gelen değerleri Label1’e yazdırdık.Querystring ile gelen verileri değiştirdiğimizde,ekrana yazdırdığı sonucun değiştiğini göreceksiniz.
Amacımız bunu engellemek yani querystring’i güvenli hale getirmek.Bunun için querystring’i şifreliyoruz.
Güvenli querystring gönderme işlemi için yapmamız gereken işlem aşağıdaki gibidir

protected void btnTopla_Click(object sender, EventArgs e)
{
NameValueCollection queryString = HttpUtility.ParseQueryString(string.Empty);
queryString["sayi1"] = txtSayi1.Text; //textboxdan gelen değerleri alıyoruz
queryString["sayi2"] = txtSayi2.Text; //textboxdan gelen değerleri alıyoruz
string hashValue = HashHelper.ComputeHash(txtSayi1.Text + txtSayi2.Text); // şifreliyoruz..
queryString["hash"] = hashValue; //şifrelenen değerleri querstring'e atıyoruz.
Response.Redirect("Topla.aspx?" + queryString.ToString());
}

Şifreli querystring değerlerimiz gönderdik..

public partial class Topla: System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
var sayi1= Request.QueryString["sayi1"].ToString(); //querystring değerlerini alıyoruz.
var sayi2= Request.QueryString["sayi2"].ToString();
var sifre= Request.QueryString["hash"].ToString();
var computeHash = HashHelper.ComputeHash(sayi1+ sayi2); //querystring ile gelen şifreyi çözümlüyoruz.
if (sifre== computeHash) // şifre çözümleme doğruysa.
{
var sonuc= Int32.Parse(sayi1) + Int32.Parse(sayi2); //toplama işlemini yapıyoruz
Label1.text="Sonuc = " + sonuc;
}
else
{
Label1.text="Querystring değerleri üzerinde oynama yapmayınız!"; // hata mesajı veriyoruz
}
}
}

Şifreleme için kullandımığız hashhelper sınıfı aşağıdaki gibidir

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();
}
}

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir