Yaptıklarımı sadece yaptığım zaman anlayabilirsiniz.

15 Temmuz 2009 Çarşamba

Asp.Net İle Kriterli Karakter Filtreleme

Merhaba arkadaşlar ben Kerem [ Dekan ] bu gün sizlere bu makalemde asp.net ile beraber kriterli filtreleme olayını nasıl yapacağımızı göstereceğim.Seneryomuz şöyle; bir projemiz var kullanıcılarımız sürekli foruma mesajlar atıyor ancak attığı mesajlardaki bazı karakterlerin görüntüsü farklı oluyor yani bir şey anlatırken püf noktasını yazarken onu kalın olarak yazmak isteyebilir.Bizim buna izin vermemiz demek html kodlarını engellememiz demektir buda bir saldırgan sayfamıza girdiğinde css,html kodları ile sayfamız üzerinde istemediğimiz kodlar çalıştırabilir örneğin " bu şekilde girdiği bir metinle beraber sayfamız açıldığında eğer herhangi bir encode durumu yok ise sayfamız saldırganın belirttiği sayfaya yönlenecektir.
Bu durumda sayfamızdaki bütün html kodlarını engellememiz lazım ancak bu sefer forumumuza bir kalın text göndermek isteyen kullanıcıyıda engellemiş oluruz bu kullanıcıyı kısıtlamak demektir.
Bu ve bunun gibi durumlara istisna html filtrelemesi yapmamız gerekiyor.Ben sizlere bu gün bunu asp.net içerisinde nasıl yapabileceğimizi göstereceğim.
Sayfamıza bir adet DataList,Buton,TextBox ekliyoruz ve sayfamızın load event’ine yani sayfamız açıldığında olacak olaylara bakıyoruz.

protected void Page_Load(object sender, EventArgs e)
{
doldur();
}


Doldur isimli bir method var .Bu methodumuz sayfamızın içerisine verilerimizi çekiyor bir göz atalım!

Void tipinde ve az öncede söylediğim gibi veritabanımızdan veri çekiyor.
void doldur()
{
SqlConnection baglanti = new SqlConnection("Data Source=.;Initial Catalog=AI;Uid=sa;Pwd=12");
baglanti.Open();
SqlCommand cmd = new SqlCommand("select * from tema", baglanti);
DataList1.DataSource = cmd.ExecuteReader();
DataList1.DataBind();
}

Şimdi butonumuzun tıklanma olayında textbox’daki verilerimizi kaydedeceğimizi söylemiştik.Ancak bu verileri filtrelememiz lazım.
public string temizle(string karakter)//Textbox'dan gelen verilerin içerisindeki <> verileri [] olarka değiştiren method
{
if (karakter.Contains("<"))
{
karakter = karakter.Replace("<", "[");
}
if (karakter.Contains(">"))
{
karakter = karakter.Replace(">", "]");
}
return karakter;
}

Gördüğünüz gibi textbox’dan dbmize gidicek olan veriler içerisindeki <> karakterlerini [] olarak değiştiriyoruz.
Butonumuzun click event’indeki kodlarına bakalım.




protected void Button1_Click(object sender, EventArgs e)
{

SqlConnection baglanti = new SqlConnection("Data Source=.;Initial Catalog=AI;Uid=sa;Pwd=12");
baglanti.Open();
SqlCommand cmd = new SqlCommand("insert into tema(my) values(@text)", baglanti);
cmd.Parameters.Add("text",temizle(TextBox1.Text));
cmd.ExecuteNonQuery();
doldur();


}


cmd.Parameters.Add("text",temizle(TextBox1.Text));
Şurada gördüldüğü gibi verilerimiz db mize gitmeden önce temizle fonksiyonumuza ugruyor istemediğimiz karakterlerimizi replace ediyor yani değiştiriyor ve daha sonra veritabanımıza kaydediyor.Buraya kadar herşey normaldi ancak az önce makalemizin en başındada belirttiğim gibi peki kullanıcımı Dekan is black coder şeklinde bir kod girseydi onunda karakterlerini <> replace ederek şu şekilde dbmize gömecekti ki öyle gömmesine izin veriyoruz. [b]Dekan is bad coder[/b] işte dananın kuyrugunun koptugu yer burası browserımıza db’mizden gelen [b]Dekan is bad coder[/b] kodlarımızı derletirken ne yapmamız gerekiyor ? Nasıl bir yol izlemeliyiz ? her karakter için oturup if kontrolü yazmaya kalkarsak javascript,css,html için neredeyse 250 tane if olacak 
Ve bazı bilmediğimiz (çok kullanılmayan) html fonksiyonlarıda var işte ters algoritma kurmamız lazım yani sayfamızda bizim izin verdiğimiz kodlar dışında olanları yorumlama ! dememiz lazım
Oda şu şekilde oluyor.


public static string aqua(string karakter)
{
if (karakter.Contains("[b]"))
{
karakter = karakter.Replace("[b]", "");
}
if (karakter.Contains("[/b]"))
{
karakter = karakter.Replace("[/b]", "
");
}
if (karakter.Contains("[i]"))
{
karakter = karakter.Replace("[i]", "");
}
if (karakter.Contains("[/i]"))
{
karakter = karakter.Replace("[/i]", "
");
}
return karakter;
}
Not : Burada methodumuzu static yapmamızın amacı az sonra göreceğiniz aspx kodları içerisinde fonksiyonumuzu çagırabilmemiz içindir.




Aspx kodlarımız şu şekilde;


<%#default_aspx.aqua(Eval("my").ToString()) %>




Yukarıda form’a ekleyeceğimiz veriler arasında datalisti söylememin amacı buydu kodlarımızı canlı canlı görmemiz lazım 



Yukarıdaki resimde gördüğünüz gibi my kolonumuzdan gelen verilerimizi filtreliyor peki my kolonumuz db de nasıl ? yani içerisinde nasıl veriler tutuyor ?


Yani anlatmak istediğim runtime esnasında gelen kodlarımızı asp.net ile değiştirip browser’a değiştirdiğimiz kodlar ile derlettirmek yani db’mizden gelen verilerimiz hiçbir şekilde html olmamı kullanıcılara asla güvenmeyin!

Peki ekstra bir durumumuz var ya db’mizde eskiden html kodlar olsaydı yani ?
[[h5]Yaptklarm sadece yapt��zaman anlayabilirsiniz.[/h5]
[h1]Kerem[/h1]
<-h1>Kerem //Kod blogda yorumlandığı için editlendi
[script]Alert(1)[/script]
[b]Kerem[/b]
[i]Kerem[/i]
NULL
Şu şekilde olsaydı ne olacaktı ? tabiî kide 3. satırda olan verimiz Kerem kodları browser tarafında çalışacaktı ve kocaman bir kerem yazacaktı !
O yüzden ilk önce tablomuzdaki <> arakterlerimizi T SQL’in replace fonksiyonu ile değiştirmemiz lazım 

Yazan Dekan [a.k.a] 17

0 yorum:

Yorum Gönder