Sunucu Güvenliği : SQL Injection

Adı üzerinde SQL enjeksiyonu. Kelime bence tam olarak oturmuyor ama konuyu terimsellestirmek için yazılmış. Sanki SQL’e bir virüs enjekte ediliyor gibi bir anlam çıkartıyor insan ilk duyduğunda. Oysa tam olarak SQL’e SQL enjekte edilerek yapılıyor bu saldırı.

Diyelim ki bir kullanıcı giriş formunuz var. Bu formda haliyle kullanıcı adı, şifre ve CSRF ataklarini onlemek için kullandığınız captcha değerini alıyorsunuz. Hatta SSL güveliği tam olarak kapsıyor sitenizi ve XSS saldırılarından korunmak ile ilgili tüm tedbirleri de aldınız. Fakat hala acemice/dikkatsizce yazılmış bir kodunuz varsa veya çok eski bir php4 ya da php5 kodu çalıştırıyorsanız bir açığınız olabilir. SQL kodlarının bir enjeksiyon denemesi ile tamamlanarak veritabanı sorgularınızın bozulup bozulamayacağını bilmiyorsunuz. Örnek verirsek;

gibi bir formunuz var diyelim. Normalde bu kisimdaki beklentiniz kullanici adi kismina kullanici adi ya da eposta yazilmasi. Sizin de bunu PHP gelistiricilerinin coktandir tavsiye etmedigi ama hala pek cok eski kitapta yer alan mysql_* fonksiyonlari ile kontrol ettiginizi dusunelim. Basitlestirince soyle bir sorgunuz var demek oluyor;

Bu sorgu yaptigi kontrolde username alani yerine peki bu kod gelirse ne olacak;

Sorgumuz bu durumda kullanici adi bos veya 1=1 ise anlamina geldi. Bu şekilde saldırgan sadece bu alanı değil aynı zamanda captcha ya da parola alanlarını da kullanabilir. Yani tüm sorguyu istediği hale getirebilir. PHP geliştiricileri bu noktada önceden kendi classlarini kullanarak tek tırnak veya çift tırnak gibi karakterleri regex filtreleri ile temizliyorlardı. Addslashess, mysql_real_escape_string gibi bazı fonksiyonlar kullanılıyordu. Fakat bu yeni PHP versiyonlarında mysql driverlerin yerini mysqli ve PDO aldığı zaman değişti.

Örneğin bir PDO baglantısında dışardan aldığınız verileri için sorgunuzu şu şekilde hazirladığınızda SQL injection riskiniz ortadan kalkıyor.

Ayni şekilde ( ben bu noktada PDO kullanmanizi tavsiye ettigim icin mysqli sorgusunu sona koyuyorum ) mysqli için de bunun bir yolu var.

Bu noktada güvenliğin bir maliyeti oldugunu da söylemek gerek. Mysqli performansi %1-5 arası sorguya gore mysql_* ile karsılaştırıldığında düşebiliyor. Fakat zaten mysql_* için yazılacak veya kullanılacak kodların da performansa etkisi olacağı için bunu görmezden gelebiliriz.

Bu yazıda SQL Injection ile ilgili örnekler vermiş oldum. Bunu kendi kodunuza uyarlayarak güvenliği arttırabilirsiniz. Zaten artık mysql_* yeni PHP sürümlerinde kullanılmayacak. Fakat injection mantığını öğrenmek, özellikle kullanıcıdan gelen veriye güvenmemek refleksinizi korumalısınız.

Herkese iyi çalışmalar…

Guncelleme (15 Ekim 2017):

Bir de SQL Injection icin sunucu ayarlari kapsaminda alinabilecek bir tedbir var. Apache modullerinden security modulu ile SQL Injection aciklarinin onune gecilebiliyor. Bunun icin modulu sonradan kurmaniz gerekiyor cunku default kurulumda gelmiyor. Ayrica bu konu icin bir yazi yazacagim.

VPS ve Linux

Bir süredir Ubuntu linux kullanıyorum. Deneyimlerimi sıcak sıcak paylaşmak isterim. Bir kere linux kullanıcı dostu olmak yolunda ciddi yol almış. Sadece Ubuntu değil Mint Linux oldukça güzel sistemler. Ubuntu, başlagıç kullanıcıları için tavsiye edilse de server sürümü de mevcut. Onu da VPS üzerinde kullanıyorum. Gayet hızlı.

ubuntu

Linux’un bir güzel yanı derlenmemiş dosyaları çalıştırmak için Windows’da olduğu gibi ortam değişkeni tanımlanıza gerek yok. Dosyaya chmod izinlerinden çalıştırılabilir dosya özelliği atıyorsunuz oluyor  bitiyor.

Herşeyi elle ayarlama işini yapabilirsiniz ama bilgisayar kullanmanın genel kitle için internet kullanmaya dönüştüğü şu dönemde hiçbir şeyi  ayarlamadan internette girip rahatlıkla gezinebilirsiniz. Kurulumda çok kolay. Wubi ile Windows içinden Ubuntu kurabilirsiniz. Bir disk bölümü seçiyorsunuz o kendisi hallediyor işlemleri. Açılışta da Windows mu yoksa Ubuntu ile mi açacaksınız diye soruyor. Bunları detaylı yazmıyorum çünkü internette bir çok kaynak var bununla ilgili.

Linux ile uğraşmamın bir nedeni geliştirme ortamı olarak kullanmak. Eclipse ve Java tabanlı diğer uygulamalar inanın Windows ortamına göre çok çok hızlı ve kararlı. Pek çok plugin Eclipse kurulumlarında sorun verirken Linux içinde hızla hallettim. Eclipse için SVN ve SQL Explorer pluginlerini rahatlıkla ekleyip internetten biraz ingilizce kaynak araştırırak ayarlayabilirsiniz. PHP ve MySQL kurmak ise çok basit. Bir komut ile yapabiliyorsunuz. Hepsi bloglarda detaylı var.

Geliştirme ortamı dışında VPS kiralayıp Ubuntu Sever kurarak hosting masrafımı düşürmek istedim. Bu sırada ISPConfig ve Zpanel ile yönetim araçlarını buldum. İkisi de plesk ve cpanel gibi web control panelleri. Zpanel başlangıç için güzel. Fakat sadece Apache ile çalışıyor. Onun kütük dosyalarını işleyebiliyor. ISPConfig daha etraflıca birşey. Zira Nginx server ile de çalıştırabiliyorsunuz.

Ben açıkcası geç kalmışım. İşten güçten zaman ayırıp uğraşmıyordum. Şimdi tatilde linux ile uğraşma fırsatı bulunca keşke işi gücü bırakıp linux öğrenseymişim diyorum. Sizde mutlaka deneyin, Özellikle yazılım geliştirici iseniz windows açmak istemeyeceksiniz.