Bugün uzun zamandır yazmayı düşünüp de yazmaya vakit bulamadığım bir konuyu paylaşacağım.SQL injection dinamik SQL sorgularında meydana gelebilecek bir açıktır.Bu açık sayesinde veritabanına  yetkili girişi yapılarak sızılabilir.Bu tarz saldırılar genelde kullanıcı girişi kontrollerinde kolayca kullanılabilmektedir.Örnek  SQL injection uygulanabilecek  bir sorgu şu şekildedir.

sorgu = "select * from Users Where Username = '" + xtUserName.Text.Trim() + "' and Password = '" + txtSifre.Text.Trim() + "'";

Formumuzdaki kullanıcı adı alanına şunu yazalım:

'or 5=5 --

Şifre alanına ise ne yazıldığı önemli değildir.Giriş butonuna bastığınızda başarılı bir şekilde oturum açıldığını göreceksiniz.Kullanıcı adı alanına girdiğimiz ifadeden sonra sorgumuzu tekrar inceleyelim bakalım neler olmuş.

select * from Users  where Username=" or 1=1 –-

Sorgumuz bu hale geldi.Burada Username false döner ve 1=1 olduğundan true döner.True ve false or işlemine tabi tutulunca biri doğru olduğundan dolayı true döner.Bu yüzden where koşulumuz true döndürür ve tüm kayıtları getirir.İlk bulduğu kayıt ile giriş yapılmış olur.Peki şifre alanı yazılanlar ne oldu dersiniz?SQL’de -- ifadesi kendisinden sonra yazılanları yorum satırı olarak görür:)Bunu engellemek için optimum çözümlerden biri  SqlCommand nesnesi kullanarak girilen kullanıcı adı ve şifreyi parametre olarak göndermektir.Yukarıdaki örneği şu şekilde yazabiliriz: 

string sorgu = "select * from Users where Username =@user and Password=@pass";

SqlCommand cmd = new SqlCommand(sorgu,conn);

cmd.Parameters.AddWithValue("@user", (string)txtUserName.Text);

cmd.Parameters.AddWithValue("@pass",(string)(txtSifre.Text)); 

SQL injection’ı bu şekilde parametre kullanarak alt alt edebiliriz.Hatta daha da  iyisini yapmak mümkün .Stored Procedure kullanarak hem güvenlik hem performans hem de hız konusun da yüksek başarım sağlayabiliriz.Stored procedure’larla ilgili bilgi için önceden yazmış olduğum makaleye göz atabilirsiniz.

Teşekkürler.

About the Author