Yazý Boyutu Yazýlarý Büyüt Yazýlarý Küçült
 SQL Injection Nedir?, SQL Injection'dan Korunma
 

SQL Injection Nedir?

Günümüzde çoğu web uygulaması SQL yapısal sorgulama dilini kullanarak veritabanından bilgiler alır ve dinamik sayfalar aracılığı ile kullanıcılara iletir. SQL sorgulama dili sadece veritabanından bilgi almak için değil aynı zamanda yeni kayıt eklemek, kayıtlar üzerinde değişiklik yapmak ve kayıtları silmek gibi birçok işlemde kullanılabilmektedir.
SQL Injection ise, web sayfamızda kullandığımız SQL cümlelerinin içine bilgimiz dahilinde olmadan başka SQL sorguları eklemek (Enjekte etmek) ve bu komutları çalıştırmak olarak açıklanabilir. SQL sorgulama dili ile veritabanındaki bilgiler üzerinde değişiklik yapmak, kayıtları silmek gibi işlemler yapılabildiği göz önüne alınırsa SQL injection web sitemiz için çok tehlikeli sonuçlar doğurabilir. Özellikle veritabanımızın yedeğini düzenli olarak almıyorsak tüm bilgileri kaybetme ihtimalimiz bile mevcuttur.

SQL injection çoğu zaman kullanıcıdan bilgi aldığımız yerlerde karşımıza çıkmaktadır. Örnek olarak kullanıcı adı ve şifresini istediğimiz kullanıcı giriş sayfaları, site içi arama yaptırdığımız arama kutuları ve kullanıcıların yorum yazabildikleri yorum alanlarını sayabiliriz. Bunlardan başka adres çubuğuna SQL komutları yazarakta SQL injection yapılabilmektedir.

Şimdi bu durumları birkaç örnek ile açıklayalım:

Site İçi Arama İşlemleri:
Tipik bir arama sorgusu aşağıdaki gibi olabilir.
"SELECT * FROM Urunler WHERE Acilama LIKE '%" + txtArama.Text + "%'"
Burada kullanıcının arama kutusuna yazdığı kelimenin ürünler tablomuzda herhangi bir ürünün açıklamasında bulunup bulunmadığı kontrol ediliyor. Öreneğin kullanıcı mp3 kelimesini arasaydı sorgumuz
"SELECT * FROM Urunler WHERE Acilama LIKE '%mp3%'"
şeklinde olcak ve ürün açıklamasında mp3 bulunan ürünler listelenecekti. Fakat SQL injection amaçlı sitemizi ziyaret eden ziyaretçi(!) arama kutusuna
"mp3; delete from urunler;" yazarsa ve biz kullanıcıdan aldığımız bu parametreyi sorgumuzda olduğu gibi çalıştırırsak ürünler tablomuzun üzerine bir bardak soğuk su içmek durumunda kalabiliriz. SQL yapısal sorgulama dilinde ";" satırın bittiğini, yeni bir satırın başladığını bildirir ve noktalı virgülden sonra yazılan SQL sorgusuda ayrı bir komut olarak çalıştırılır.

Kullanıcı Giriş İşlemleri:
Kullanıcılardan bilgi aldığımız üyelerimizin sitemize giriş yaptıkları kullanıcı giriş sayfalarıda SQL injection'a oldukça müsait sayfalardır. Dikkat edilmeden hazırlanmış birçok kullanıcı giriş sayfasında aşağıdaki gibi bir SQL sorgusu kullanılmaktadır.
"SELECT * FROM Uyeler WHERE UyeAdi='" + txtUyeAdi.Text + "' AND Sifre='" + txtSifre.Text + "'"
Bu örnektede iyi derecede SQL bilen ziyaretçimiz(!) kullanıcı adı alanına ' OR 1=1 -- ve şifre alanına herhangi bir şey yazdıktan sonra sitemize üye olarak girmekte hiçbir zorluk yaşamayacaktır. Kullanıcıdan aldığımız bilgleri sorgumuza yerleştirirsek
"SELECT * FROM Uyeler WHERE UyeAdi='' OR 1=1 --' AND Sifre='herhangi bir şey'
gibi bir sorgu cümlesine sahip olacağız. Bu örnekte SQL yapısal sorgulama dilinde yazılanların çalıştırılmayacağını açıklama anlamına geldiğini bildiren "--" karşımıza çıkıyor. Sorgumuzu incelersek kullanıcı adı boş veya 1=1 durumuna uygun olan kayıtların geri döndürüleceğini görüyoruz.
Kullanıcı adı boş olan bir üyemiz olmasa bile 1 her zaman 1'e eşit olacağı için sorgumuz geriye kayıt döndürecektir. Sorgumuzda 1=1 den sonra gelen "--" işaretinden sonraki hiçbir ifade veritabanımız tarafından dikkate alınmayacaktır.

Aynı sorguyu "--" işaretleri kullanmadan atlatmakta mümkün. Kullanıcı adı ve şifre alanlarına ' OR ''=' girildiği zaman sorgumuz
"SELECT * FROM Uyeler WHERE UyeAdi='' OR ''='' AND Sifre='' OR ''=''"
olacak ve geriye yine kayıt döndürecektir.
Bu örnektede görüldüğü gibi kullanıcıdan alınan bilgileri sorgumuza olduğu gibi dahil etmek çok sakıncalı bir işlemdir.

Adres Satırından Alınan Parametreler:
Günümüzde birçok dinamik web uygulaması tarayıcılar vasıtası ile adres satırından parametre almaktadır.
"http://www.orneksite.com/urunler.aspx?catid=3"
"SELECT * FROM Urunler WHERE Kategori=" + Server.HtmlEncode(Request.QueryString["catid"])"
Örneğinde olduğu gibi adres satırına girilen parametreyi sorgumuza yerleştirmek yukarıda bahsettiğimiz sakıncalara yol açabilir. Kullanıcı yine ";" yardımı ile başka bir SQL komutu çalıştırabilir.
Adres satırından parametre almamız gereken durumlarda eğer nümerik bir parmetre bekliyorsak Convert.ToInt32() gibi bir fonksiyon yardımı ile gelen parametreyi nümerik değere çevirerek kullanmakta veya alfanümerik parametreler için gelen parametreyi kendi hazırladığımız bir fonksiyon yardımı ile temizleyerek kullanmakta fayda var.

Yukarıda saydığımız SQL injection metodlarını uygulamamıza aşağıdaki gibi basit bir fonksiyon ekleyerek bertaraf edebiliriz.

public static string SQLTemizle(string psqlquery)
{
psqlquery = psqlquery.Replace("'", "''");
psqlquery = psqlquery.Replace("--", "");
psqlquery = psqlquery.Replace("/*", "");
psqlquery = psqlquery.Replace("*/", "");
psqlquery = psqlquery.Replace(";", "");
psqlquery = psqlquery.Replace("drop", "drp");
psqlquery = psqlquery.Replace("DROP", "DRP");
psqlquery = psqlquery.Replace("alter", "atr");
psqlquery = psqlquery.Replace("ALTER", "ATR");
return psqlquery;
}

Kullanıcıdan aldığımız bilgileri sorgumuza yerleştirmeden önce SQLTemizle(txtArama.Text) gibi zararlı meta karakterleri ve komutları temizleyerek kullanırsak SQL Injection'dan büyük ölçüde korunmuş oluruz.

Faydalı olması dileğiyle,
Mustafa Altuntaşlar

Yazýnýn baþýna git 13.04.2008

Etiketler:  SQL, Güvenlik

Bu yazý için henüz yorum yapýlmamýþ.  

Yorum Yazabilirsiniz

Ad Soyad:  
e-posta:   
Yorum:  
255  
Güvenlik Kodu:
Resimdeki güvenlik kodunu yandaki kutucuða giriniz
IP Numaranýz: 38.103.63.58