16 Şubat Cumartesi ´08   —   3 Yorum
v0.7'de altyapıda neredeyse bütün işlerimi PEAR'a yaptırdım. Son günlerde pear'da mysql işlemleri ile ilgili sorular sorulmaya başlandı, ben de yazayım dedim, pear ile SQL işlemlerini MDB2'ye yaptırmaya yönelik 2 döküman yazdım. İkincisi diğerinin devamı gibi oldu ama ana konu sql injection'dan kaçmak. Yine de vermem gereken bilgileri verdim :-)

Pear'da MDB2 ile veritabanı işlemleri
PEAR ve MDB2 ile “Prepare & Execute” sayesinde SQL injection saldırılarına karşı koymak
PEAR'da MDB2 ile veritabanı işlemleri hakkında daha önce döküman yazmıştım (aynı anda yayınladım gerçi). MDB2 ile veritabanı işlemleri ile ilgili bilgi edinmek içinhttp://www.mfyz.com/?/dokuman/99/pear-da-mdb2-ile-......islemleri/ dökümanını okuyun. Bu dökümanda veri işleme ile ilgili kısımlardan bahsetmeyeceğim.


SQL injection, başımızın belası :-)


SQL injextion saldırılarını çok duyuyoruz. Çok da yeni bir şey değil aslında. Fakat çok büyük sitelerde, devlet siteleri, ticari siteler vs. Dikkatsiz programcılar veya dikkatsiz programlama sonucu bu saldırılara kurban gidiyor. Her gün bir yerlerin "hack"lendiğini görüyoruz. Muazzam işler yapmaya gerek yok bu saldırıları yapmak için.

Aynı şekilde bu açıkları vermemek için de muazzam önlemler almanıza gerek yok aslında. Bütün olay kullanıcın girdiği metinleri işlerken ve ekrana basarken kontrollü basmakta yatıyor bu injection, xss saldırılarının altyapıları. Sitenizde sql'inize veya htmlinize enjekte etmek istedikleri şeyleri aslında sizin tırnaklarla sınırladığınız alandan kaçarak başarıyorlar. Tabiki herşey tırnakta çözülmüyor fakat dananın kuyruğunu kopardıkları yer sizin sınırlandırdığınız noktadan kaçabilmekte :-) Yani Hex kodları ile tırnak veya özel karakterler girilmeye çalışıyor, tırnaklar kullanılıyor veya ascii, htmlentity, htmlencode ile özel karakter girmeye çalışılıyor. XSS konusunda burada bahsetmeyeceğim.

SQL injection için eğer pear ve mdb2 kullanmıyorsanız, kullanıcıdan gelen string türü verileriniz için mysql'de mysql_real_escape fonksiyonunu kullanabilirsiniz. Metinlerinizi bu fonksiyondan geçirip sqlinize sokun. Eğer MDB2 kullanıyorsanız Preapre ve Execute fonksiyon grubu ile uygulatmak istediğiniz sql cümlenizdeki değişkenleri işletmeden önce veri türüne göre güvenli hale getirebilirsiniz.

Aslında tek görevi güvenlik değil bu fonksiyonların. Asıl amaç veritabanına doğru türde veri göndermek. Aynı zamanda tek sql'i tekrar tekrar yazmadan birden fazla çalıştırmanızı da sağlıyor. Güzelliklerine az sonra değineceğim :-)

MDB2'de bir sorguyu işletmek için
$sorgu = $db->query("insert into tablom (no, yazi) values (34, 'Metin degeri')");
query fonksiyonunu kullanıyorduk. Diyelim ki 15 tane alanınız var ve hepsini "insert" sql cümlenizde kullanıyorsunuz. query fonksiyonu ile bir sürü tırnak ve değişkeni cümleye dönüştürmek için karışık bir kod yazacaksınız. tek satır görünümünde ama 4-5 satır uzunluğunda birşey olacak :-)

Prepare ve execute fonksiyonlarını aşağıdaki örnekle açıklayayım.
$sorgu = $db->prepare("insert into tablom (no, yazi) values (?, ?)", array('integer', 'text') );
$sonuc = $sorgu->execute(array( 34, 'Yazı yazı yazı' ));
gördüğünüz gibi 2 satırda hallettik işimizi.

$sorgu değişkenine bir sql hazırlıyoruz. Yapılan şey cümle olarak sql cümlesini sunmak, değerlerimizin yerine tırnak fln koymadan doğrudan soru işareti (?) koyuyoruz. prepare fonksiyonuna ikinci paramere olarak, dizi şeklinde veri türlerini veriyoruz. Veri türlerini string olarak elle yazıyoruz ve sorguda hangi sırada ne tür değişken olduğunu açıklıyor bu kısım aslında. Sonuçta $sorgu değişkeninde bir sql cümlesi duruyor, hangi alanlara hangi TÜR veri girileceği belirlenmiş şekilde. Amaçda bu zaten, yani alanlarımıza istemediğimiz türde veri sokmamak. Veri türleri hakkında detaylı bilgi içinhttp://pear.php.net/manual/en/package.database.mdb2.datatypes.php adresini ziyaret edin.

İkinci satırdaysa hazırlanmış sql'i işletiyoruz. Tabiki dizi olarak VERİ'lerimizi veriyoruz execute fonksiyonuna. execute fonksiyonu da $sorgu nesnesinin bir özelliği tabiki. Yani prepare olmamış bir sql execute edilemez. Hata verir. Hatta böyle bir fonksiyon yok der :-)

İşin güzelliğini örnekle açıklayayım :
$sorgu = $db->prepare("insert into tablom (no, yazi) values (?, ?)", array('integer', 'text') );
// birden fazla veriyi ayni sql ile ekleyelim
$sonuc = $sorgu->execute(array( 34, 'Yazı yazı yazı' ));
$sonuc = $sorgu->execute(array( 35, '35. yazı yazı' ));
$sonuc = $sorgu->execute(array( 36, 'Başka yazı yazı' ));
$sonuc = $sorgu->execute(array( 37, 'Yok yok başka yazı bu yazı' ));
söze gerek var mı?

text tipi alanlara otomatik olarak sql injection için kaçmak amacıyla kullanılan özel karakterler dönüştürülüyor. Zaten text dışındaki alanlara herhangi bir string veri kaydedilemiyor. Yani herşey kontrol altında.

Eğer sql cümlenize katacağınız HERHANGİ bir değişken kullanıcı kontrolüyle geliyorsa prepare & execute yöntemini kullanın. Eğer uygulamanızda basit bir sql işlemi kullanıyorsanız işinizi query ile halledebilirsiniz.

Konu hakkında mdb2 manual'da ki bilgiye de göz atmanızı öneririmhttp://pear.php.net/manual/en/package.database.mdb......xecute.php


Hazırlayan : Mehmet Fatih YILDIZ

Popüler Etiketler

mootools jquery örnek kod javascript js internet explorer web app php open source tebrik lifestream rss mfyz proje apache kurulum html form input textarea select less css compile compiler macosx windows linux app on-the-fly opengraph graph api facebook share social css3 browsers support konsol terminal wordpress dokuman plugin pear mdb2 prepare execute mysql mssql pgsql sql injection apple nasıl code development ios iphone ipad app store store in-app purchase purchase subscription verification storekit itunes connect itunes job developer wanda workspace cookie subdomain optimization object session tool db database service free gimp howto phpstorm jetbrains ide editor startups subversion svn xml nedir htaccess url mobile mail signature imza twitter widget www redirect crossdomain framework wireless git version control deployment pharma hack optimizasyon analyse procedure istatistik insanlar internet statistics google search ajax screen applications meta integration server firefox newsletter generator kampanya login portfolio ubuntu cache box coding player license lisans iOS logo ruffles oyun connect date diff calendar media regex html5 radio style network blog parse fstab ntfs button xmlhttprequest bootstrap xhtml digital doritos tytz mod_rewrite assets banner tarih zaman cms table ui ux icons kitap design laptop notebook osx ipucu music spam switch fql chart grafik while query seo ie browser auth http language link sitemap route router export sosyal medya webkit download icon ikon kontrol yapıları if