ASP.NET QueryString Güvenliği

Temmuz 25, 2008

QueryString’leri birçoğumuz yoğun olarak kullanmaktayız.Günümüzde sistemlerde oluşan güvenlik açıklarından bir tanesi de yanlış ve kontrol edilmeyen querystring’lerden oluşmaktadır.Peki bunu nasıl engelleyebiliriz?

Düşünüyorum:

1-Bir sayfaya gelecek bütün querystring’leri almalıyım.

2-Bu gelen querystring collection’u analiz etmeliyim.

3-Kötü bir durum var ise engellemeliyim.

Algoritma tamam.Uygulamaya geçelim.İlk once sayfaya gönderdiğimiz querystring’leri nasıl toplayabiliriz?.

Querystring’ler .net’in NameValueCollection sınıfından türemektedir.Söyle bir querystring’imiz olduğunu varsayarsak:

update.aspx?ID=45&Mod=A&qu_id=45567 //tamamen salladım

Burdaki querystring değerlerini direk sql içine gömüyorsak;

Select *from urunler where id=”+Request.QueryString[ID]+”;

gibiSqlInjection yeme şansımız oldukça yüksektir veya aldığımız querystring’i direk yazdırıyor isek;

Response.Write(Request.QueryString[ID].ToString());

Bu seferde XXS(Cross-site Scripting) yeme şansımız yüksektir.Devam edelim.

private bool IsQueryStringsSafety(NameValueCollection qry)

{

string[] badWords ={ “DELETE”, “delete”, “‘”, “select”,”DELETE FROM”,”delete from”,”UPDATE”,”update”,”UPDATE FROM”,”update from”,”select *from”,”SELECT *FROM”,”<”,”>”,”OR”,”AND”,”OR=”,”=”,”‘OR=’”,”‘OR’”};

for (int i = 0; i <= qry.AllKeys.Length – 1; i++)

{

for (int a = 0; a <= badWords.Length – 1; a++)

{

if (qry[i] == badWords[a])

{

return false;

}

}

}

return true;

}

Yukarda yazdığım fonksiyon belirlenen değerler ile gelen querystring’leri karşılaştırarak kötü bir kod’un olup olmadığını bize bool türünden döndürmektedir.badWords’ü ben string dizi olarak yaptım isteğe gore xml’de tutulabilir,vt’de tutulabilir v.s.

using System.Collections.Specialized; //eklemeyi unutmayalım.

protected void Page_Load(object sender, EventArgs e)

{

private NameValueCollection qStrings;

//Gönderilen bütün querystring’leri kolleksiyona alalım

qStrings = Request.QueryString;

if (IsQueryStringsSafety(qStrings))

{

//eğer güvenli ise

}

else

{

//yapılacak işlemler.Kullanıcı ip’si alınabilir(mesela)

}

}

Ufak ama etkili bir yöntem.

Rock C# !! :)