Sql İnjection Korunma
Daha önce işlemiş olduğum sql injection konusuna devam ediyorum.Evet zamanında çok açıkları bulunmasına rağmen şimdilerde sql injection ne olduğunu bilen ve korunma yöntemlerini bilen programcılar için çok fazla sorun yaratmıyor.Aşağıdaki makalede bu yöntemler ele alınmıştır.Unutmayın güvenliği olmayan kodun hiç bir anlamı yoktur…
login.aspx sayfamızda yer alan Button’un OnClick olayına şu şekilde kod yazılmış olduğunu farzedelim.
private void Button1_Click(object sender, System.EventArgs e)
{
string strCnx = ConfigurationSettings.AppSettings[”BadconnStr”];
SqlConnection conn = new SqlConnection(strCnx);
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = “Select * From users Where username = ’”+ txtusername.Text +”’AND password = ’”+ txtpassword.Text +”’ “;
SqlDataReader dr;
dr = cmd.ExecuteReader();
if(dr.Read())
{
FormsAuthentication.RedirectFromLoginPage(txtusername.Text,false);
}
else
{
ErrLabel.Text = “Başarısız İşlem”;
}
}
’or 1=1–
Peki bu Sql Injection saldırısının çalışmasını sağlayan hatalar neydi? Kodumuzu satır satır inceleyelim.
string strCnx = ConfigurationSettings.AppSettings[”BadconnStr”];
SqlConnection conn = new SqlConnection(strCnx);
bu ifadede BadconnStr değerini Web.config sayfamızdan almaktayız. Web.config sayfamızda yer alan ConnectionString ifademiz şu şekildedir.
Bu ConnectionString ifadesindeki hata veritabanına sa olarak bağlanmamızdır. Hiçbir zaman veritabanına sa kullanıcısı olarak bağlanmayın. Çünkü sa veritabanı üzerinde çok yüksek haklara sahiptir. Oysa bize gerekli olan sadece SELECT sorgusu.
Diğer bir hata ise sorgu işleminin dinamik olarak yapılması. Eğer bu şekilde dinamik olarak SQL sorguları yaratılırsa yukarıda girilen ’or 1=1– ifadesinin girilmesi ile çok büyük güvenlik açıklarına neden olursunuz. Peki ne yapacağız. Yukarıda bahsettiğim prensiplere göre parametre olarak veri göndermeli veya Stored Procedure kullanmalıyız.
Aslında yukarıda TextBox’lara girilen değerleri de kontrol etmemiz gerekir. Yine aynı şekilde TextBox’ın MaxLength özelliğinin mutlaka kısıtlanması gerekir. Yani TextBox’lara sınırsız karakter girilmesini önlemeliyiz. TextBox’lara girilebilecek özel karakterleri de kontrol etmeliyiz. Yani ’ ” - + # % & gibi bir çok karakterlerin girilmemesini sağlamalıyız.
Sadece ’or 1=1– ifadesinden farklı Sql Injection saldırıları da olabilir. Örneğin yine kullanıcı adını girdiğimiz TextBox nesnesinin içine,
’; UPDATE users SET password = ’deneme’ WHERE username = ’mehmet’ —
ifadesi de girilebilir. Peki bu Sql Injection ne gibi zararlara neden olur?
Bu ifade ile çoklu Sql deyimleri noktalı virgül yardımı ile aynı anda çalıştırılabilir. Bu ifade ile users tablosunda yer alan kullanıcı adı mehmet olan kişinin şifresini deneme olarak değiştiriyor.
Eğer yukarıdaki gibi kötü yazılmış bir kod varsa bu işlem başarı ile gerçekleştiriliyor. Yine aynı şekilde buna benzer bir ifade ile, veritabanında yeni kullanıcılar yaratılabilr, bir tablo silinebilir, veya herhangi bir stored procedure yazılarak çok farklı işlemler gerçekleştirilebilir. Bunu önlemenin yolu veritabanına bağlantı yaptığımız ConnectionString’inde yer alan user’a sadece ve sadece gerekli izinler verilmelidir. Örneğin, burada user’ın sadece SELECT ifadesi için izin verilseydi hiç bir sorun olmayacaktı.
Yukarıda makalenin ilk başında bahsettiğim 5 temel prensibin hepsi bu login işleminde uygulandı. TextBox nesnelerine girilebilecek max karakter sayısının kısıtlanması ile çalışabileck Sql deyimleri girilemez. Aynı şekilde RegularExpressionValidator ifadeleri ile özel karakterlerin girilmesi önlenlenmiş oldu. Yine ConnectionString ifademizde benim yarattığım bir kullanıcı ile bağlanılıyor. Bu kullanıcıya sadece StoredProcedure’leri çalıştırılmasına izin veriliyor. Böylece başka herhangi bir sql komutunun çalışmasına olanak tanınmıyor. Çünkü veritabanına bağlanan kullanıcının yapabildikleri kısıtlanmıştır. SqlCommandType’in özelliği Stored Procedure olarak ayarlanmış ve böylece dinamik SQL ifadelerinin kullanılması engellenmiş olur. Stored Procedure’e aktarılan parametrelerde şifrelenerek veritabanında, şifrelenmiş olarak duran kayıtlarla karşılaştırlır.
Elbette web uygulamasının içerisinde, login sayfasından farklı sayfalarda yer alan TextBox nesneleri ile kötü niyetli kullanıcılar veritabanımıza dolayısıyla web uygulamamıza zarar verebilirler. Örneğin, herkesin bildiği site içerisinde arama yapabilmemizi sağlayan TextBox nesnelerine girilen değerlerde kontrol edilmelidir.
Bu makalenin içerisinde yer alan kodları daha iyi anlayabilmek için, makale içinde geçen bazı konuları (FormsAuthentication, Verileri Şifreleme, RegularExpressionValidator, Stored Procedure) yine aspnedir.com sitesinden okumanızı tavsiye ederim.
Did you enjoy this post? Why not leave a comment below and continue the conversation, or subscribe to my feed and get articles like this delivered automatically to your feed reader.

Comments
No comments yet.
Leave a comment