Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

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.

Bunlar da hoşunuza gidebilir...

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir