Yazının eklenme tarihi: 03 Temmuz 2008 Perşembe 11:31
Şimdi sizlere web sitelerinde en çok karşılaşılan güvenlik açığı olan SQL Injection hakkında kısa bir bilgi vermek istiyorum. Gecenin bir yarısı hazırlıyorum bu makaleyi o yüzden eksik ya da hatali bilgi olursa mazur görün.
SQL Injection nedir?
SQL injection her hangi bir sorgulama sırasında, sorgulamanın saldırgan tarafından kesilip kendi sorgusunun işleme konmasidir. Biraz karisik oldu derseniz anlatmaya devam edeceğim merak etmeyin.
Bildiginiz gibi SQL cümleleri arasına noktali virgul (";") konularak ard arda farklı sql cumlelerinin bir anda işlenmesi sağlanmaktadır. İste burdaki püf noktadan hareketle devam edeceğiz. SQL cümlesi işlemleri sırasında tırnak konması önemlidir öyle ki bu tırnaklar sql cümlelerini kesebilmektedir. Örnek verecek olursal
Select * from users where username = 'hedehodo' cümlesinde tırnak içindeki kelime dışarıdan bir değişkenle alındığını varsayıp bunu bir php kodu üzerinde örnek olarak gösterirsek
$query = mysql_query("Select * from users where username = '$username'"); satırında dışarıdan alınan $username değişkenin içinde bir adet daha ' olduğunu varsayarsak gelen bilgi şu hale dönüşecektir.
$query = mysql_query("Select * from users where username = 'hede'hodo'"); bu kodu çalıstırdiğımızda ise bir hata mesaji karşımıza gelecektir çünkü SQL cümlesi hede den sonra tek tirnak gelmesiyle bitmiş arkasından gelen hodo ise sql i bozmuş ve doğal olarak calıştırılamamıştır. Şimdi eğer tek tırnaktan sonra noktalı virgül konsaydı nasıl olacaktı?
$query = mysql_query("Select * from users where username = 'hede';hodo'"); bu şekilde oldutuktan sonra artık elimizde 2 tane sql cümlesi vardır diyoruz cünkü ilk cümle notkalı virgul ile sonlandırılmış ve çalıştırılmıştır. O zaman bize kalan 2. kısmı düzenlemektedir.
$query = mysql_query("Select * from users where username = 'hede'; Update users set password='1234'"); gördünüz değil mi cümle nerelerden nereye geldi. Şimdi çalıştırılan 2. cümle users tablosundaki tüm kullanıcıların sifrelerini 1234 haline getirdi. o zaman tekrar açik bir sekilde yazacak olursak;
$username = "hede'; Update users set password='1234"; şeklinde bir username geldiği zaman SQL cümlesine etki edilmiş oluyor. Not: kafadan denemeden yazıyorum calişmazsa üstüme gelmeyin :)
bunu neden anlattım....Derler ya önlemini almak icin nasil yapildiğini bilmek lazim. PHP üzerinde bunu basit bir komutla halledebilirsiniz...
Allah addslashes komutunu koyanlardan razı olsun diyoruz ve komutu anlatıyoruz...
addslashes komutu gelen bilgi içindeki tırnak vs gibi cümleyi kesebilecek elemanların önüne ters slash ("\") işaretini koyarak bunu engellemektedir. Örnek kod verecek olursak;
$username = addslashes($_POST[username]);
$query = mysql_query("Select * from users where username = '".$username."'");
diyoruz ve kısa bir bilgiyle makalemizi sonlandırıyoruz. Hatalardan dolayı mazur görün diyorum cünkü saat sabahin 4'ü :)