Simdi sizlere web sitelerinde en cok karsilasilan guvenlik acigi olan SQL Injection hakkinda kisa bir bilgi vermek istiyorum.
Daha yeni uyandım sabah saat 07.30 da uyumuştum 16.00 da kalktım ve bu makaleyi hazirliyorum bu makaleyi o yüzden eksik ya da hatali bilgi olursa mazur gorun.
SQL Injection nedir?
SQL injection her hangi bir sorgulama sirasinda, sorgulamanin saldirgan tarafindan kesilip kendi sorgusunun işleme konmasidir. Biraz karisik oldu derseniz anlatmaya devam edecegim merak etmeyin.
Bildiginiz gibi SQL cumleleri arasina noktali virgul (";") konularak ard arda farkli sql cumlelerinin bir anda islenmesi saglanmaktadir. Iste burdaki puf noktadan hareketle devam edecegiz. SQL cumlesi işlemleri sirasinda tırnak konmasi onemlidir oyle ki bu tırnaklar sql cumlelerini kesebilmektedir. Ornek verecek olursal
Select * from users where username = 'hedehodo' cumlesinde tırnak icindeki kelime disardan bir degiskenle alindigi varsayip bunu bir php kodu uzerinde ornek olarak gosterirsek
$query = mysql_query("Select * from users where username = '$username'"); satirinda disardan alinan $username degiskenin icinde bir adet daha ' oldugunu varsayarsak gelen bilgi su hale donusucektir.
$query = mysql_query("Select * from users where username = 'hede'hodo'"); bu kodu calistirdigimizda ise bir hata mesaji karsimiza gelecektir cunku SQL cumlesi hede den sonra tek tirnak gelmesiyle bitmis arkasindan gelen hodo ise sql i bozmus ve dogal olarak calistirilamamistir. simdi eger tek tirnakta sonra noktali virgul konsaydi nasil olacakti?
$query = mysql_query("Select * from users where username = 'hede';hodo'"); bu sekilde olsutuktan sonra artık elimizde 2 tane sql cumlesi vardır diyoruz cunku ilk cumle notkali virgul ile sonlandirilmis ve calistirilmistir. o zaman bize kalan 2. kismi duzenlemektedir.
$query = mysql_query("Select * from users where username = 'hede'; Update users set password='1234'"); gordunuz degil mi cumle nerelerde nereye geldi. simdi calistirilan 2. cumle users tablosundaki tum kullanicilarin sifrelerini 1234 haline getirdi. o zaman tekrar acik bir sekilde yazicak olursak;
$username = "hede'; Update users set password='1234"; seklinde bir username geldigi zaman SQL cumlesine etki edilmis oluyor. EK1: kafadan denemeden yazıyorum calismazsa ustume gelmeyin
bunu neden anlattım....Derler ya onlemini almak icin nasil yapildigini bilmek lazim. PHP uzerinde bunu basit bir komutla halledebilirsiniz...
allah addslashes komutunu koyanlardan razı olsun diyoruz ve komutu anlatıyoruz...
addslashes komutu gelen bilgi icindeki tirnak vs gibi cumleyi kesebilecek elemanlarin onune ters slash ("\") isaretini koyarak bunu engellemektedir. ornek kod verecek olursak;
$username = addslashes($_POST[username]);
$query = mysql_query("Select * from users where username = '".$username."'");
Bu kadar umarım işinize yarar