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.

string 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";

var command = new SqlCommand(sorgu,conn);  
command.Parameters.AddWithValue("@user", (string)txtUserName.Text);  
command.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.

About the Author