ADO.NET Connected Mimari – SQL Injection
Bu yazımda SQL Injection’dan bahsedeceğim.SQL Injection özellikle web uygulamalarındaki en ciddi güvenlik açıklarından biridir.Eğer SQL sorgularımız içine programdan değer alırken o değeri + operatörü ile ekliyorsak sorgumuza dışardan her türlü müdahale yapılmasına imkan vermiş oluyoruz.
SQL Server da sorgular arasına ; koyarak tek seferde birden fazla sorgu çalıştırabiliriz.Örneğin aşağıdaki kod bloğunu inceleyiniz.TextBox’a girilen değere göre bir select sorgusu dönmektedir.
SqlConnection baglanti = new SqlConnection("Server=GENÇAY-GENÇAY;database=Northwind;trusted_connection=true;");
baglanti.Open();
SqlCommand cmd = new SqlCommand("Select Adi,Soyadi from Personeller where PersonelId = '" + textBox1.Text + "'", baglanti);
SqlDataReader dt = cmd.ExecuteReader();
while (dt.Read())
{
MessageBox.Show(dt["Adi"].ToString() + " " + dt["Soyadi"].ToString());
}
baglanti.Close();
baglanti.Dispose();
Yukardaki yapıda sorguyu incelerseniz eğer + operatörü kullanarak TextBox’a girilen değeri vermeteyiz.Burada şöyle bir uyanıklık yapabiliriz.TextBox’uma “7;delete from Personeller” yazarsam eğer,arka planda çalıştırılacak sorgu şu olacaktır;
“Select Adi,Soyadi from Personeller where PersonelId=’7′;delete from Personeller” yani önce şarta uygun tabloyu seçecek,sonrada Personeller tablosundaki bütün kayıtları silecek.
Bu büyük bir güvenlik açığıdır.Bunun çaresi ise, sorgularımıza dışarıdan değer alırken kesinlikle + operatörü ile almayacağız.Değer alırken parametre olarak alacağız ve sorguya o parametreyi göndereceğiz.
SqlConnection baglanti = new SqlConnection("Server=GENÇAY-GENÇAY;database=Northwind;trusted_connection=true;");
baglanti.Open();
SqlCommand cmd = new SqlCommand("Select Adi,Soyadi from Personeller where PersonelId = @id", baglanti);
cmd.Parameters.Add("@id", textBox1.Text);
SqlDataReader dt = cmd.ExecuteReader();
while (dt.Read())
{
MessageBox.Show(dt["Adi"].ToString() + " " + dt["Soyadi"].ToString());
}
baglanti.Close();
baglanti.Dispose();
Yukarda gördüğünüz gibi @id parametresi tanımlanmıştır.Eğer SqlCommand nesnesi içinde parametre varsa Execute etmeden önce o parametreyi SqlCommand nesnesine tanıtmamız lazım.Bunuda Parameters koleksiyon yapısıyla yapıyoruz.
