SQL Injection Nedir ?
Merhabalar,
Veri tabanları ile ilişkili kod yazmaya başlamadan önce bu konuyu bilmek çok önemli..!
SQL Injection, Veri tabanına dayalı uygulamalara saldırmak için kullanılan bir tekniğe verilen addır, sistemdeki basit bir açığınızdan yararlanarak Database’ine kolayca sızabilir veri kaybına uğratabilir veya Database’inizi dışarıya dahil açabilir.
Şimdi en basit hali ile bu nasıl oluyor görelim.
En basitinden bir kullanıcı tablosu yapıp içerisine bir kaç kullanıcı ekleyelim.
Ek olarak yeni bir proje oluşturup, iki tane login formu yapalım.
- Formdaki login kodumuzu aşağıdaki gibi yazalım.
try { MySqlConnection MMyCon = new MySqlConnection(connectionstring); MySqlCommand command = new MySqlCommand(); MMyCon.Open(); command.Connection = MMyCon; command.CommandText = "SELECT 1 FROM users_test WHERE name='" + us1.Text + "' AND pass='" + ps1.Text + "'"; command.ExecuteNonQuery(); MySqlDataReader rd = command.ExecuteReader(); if (rd.Read()) { MessageBox.Show("Giriş Başarılı"); } else { MessageBox.Show("Kullanıcı Adı veya Parola Hatalı"); } MMyCon.Close(); } catch (Exception) { MessageBox.Show("Sistem Hatası"); }
2. Formdaki login kodumuzu aşağıdaki gibi yazalım.
try { MySqlConnection MMyCon = new MySqlConnection(connectionstring); MySqlCommand command = new MySqlCommand(); MMyCon.Open(); command.Connection = MMyCon; command.CommandText = "SELECT 1 FROM users_test WHERE name=@name AND pass=@pass"; command.Parameters.AddWithValue("@name", us2.Text); command.Parameters.AddWithValue("@pass", ps2.Text); command.ExecuteNonQuery(); MySqlDataReader rd = command.ExecuteReader(); if (rd.Read()) { MessageBox.Show("Giriş Başarılı"); } else { MessageBox.Show("Kullanıcı Adı veya Parola Hatalı"); } MMyCon.Close(); } catch (Exception) { MessageBox.Show("Sistem Hatası"); }
- kodda gördüğünüz gibi ekrandan aldığım bilgileri doğrudan string cümle içerisinde kullandım, 2. kodda bu bilgileri parametre olarak geçtim.
Sonuç olarak çalışır mı evet her iki kodda çalışır. ancak 1. koddaki kullanım büyük güvenlik zafiyeti doğurur.
Şimdi kullanıcı adına mehmet, parola’ya e32rcd3 yazıp login dediğizde iki tarafda login başarılı diyor.
Ancak kötü niyetli kişi , parola alanına şöyle bir şey yazar ise ‘; TRUNCATE TABLE users_test;
2. Form ile giriş yap butonuna bastığında aşağıda gördüğünüz gibi , Kullanıcı Adı veya Parola Hatalı hatasına düşecektir.
Eğer aynı şeyi parametre kullanmadığımız kodda kullanırsa, Sistem Hatası fırlatacak yani Exception’a düşecek kodumuz ayrıca farklı kullanımlarda düşmeyedebilirdi.
ancak bu hata sonrası baktığınızda kullanıcı tablonuzun yerinde yeller estiğini göreceksiniz.
Kötü niyetli kişi parolaya ‘; TRUNCATE TABLE users_test; yazdığında, yazılan bu kod sizin cümlenize eklendi, bu bu hale geldi.
SELECT 1 FROM users_test WHERE name='mehmet' AND pass='34432a' SELECT 1 FROM users_test WHERE name='mehmet' AND pass='34432a'; TRUNCATE TABLE users_test; '
yani bizim sorgumuzun yanına kendi sorgusunu enjekte etti. yukarıda Exception’a düşmesinin sebeb dei en sonda kalan ‘ işareti.
Aşağıdaki videodan da durumu gözlemleyebilirsiniz.
Örnek bir şirketin database’inde gerçek saldırı görüntüleri.
Saygılar…