Günler geçiyor PHP versiyonları yükseliyor mysql_ fonksiyonlarını kullanmayın uyarıları artıyor, PDO veya mysqli kullanın deniyor. Bu yazımda bu konu hakkında biraz konuşacağım.
Hatırlatma
Öncelikle şunu bilmemiz gerekiyor; – Hiç bir fonksiyon sizi sql injection’dan korumaz. Bundan dolayı müyendizler Prepared Statements’ı icat etmişler.
PDO ve mysqli
PDO ve mysqli Prepared Statements kullanan 2 farklı araçtır. PDO’nun mysqli’e göre avantajı farklı veritabanı türleriyle beraber çalışabilmesi, ancak mysqli, adından da anlaşılacağı gibi sadece mysql üzerinde çalışmakta.
Prepared Statements
Adı üzerinde hazırlanmış ifadeler. Yani ifadeler (sql cümleleri) daha önceden hazırlanır ve sonra çalıştırılır.
Neden Prepared Statements ?
Başlıca sebepler;
- Performans
- Güvenlik
Performans
Geleneksel sql araçlarında (mysql_* fonksiyonlarında) sorgu her çalıştırıldığında sql cümlesi yorumlayıcı tarafından her defasında derlenir (yorumlanır) ve çalıştırılır. Ancak Prepared Statement’larda belirli bir cümle birden fazla kez çalıştırılıyorsa o cümle bir kez yorumlanır, çok kez çalıştırılır.
Güvenlik
Prepared Statement’lar SQL Injection‘dan korur. Ama nasıl ? Basit bir sql cümlesini ele alalım:
SELECT * FROM uyeler WHERE id = 1
bu cümlede parametremiz 1‘dir. Asıl cümlemiz 1’den önceki kısımdır. Kısacası 1 bizim için değişkendir. Şöyle bir şey olsa;
$ifade = hazirla("SELECT * FROM uyeler WHERE id = ?");
burada $ifade
değerine ifademizin hazırlanmasını söyledik ve parametremizin yerine ? koyduk. Daha sonra;
$ifade->bagla(1);
ile bu ifadeye parametre değerimizi bağlasak yani
? yerine artık 1 olsa ve ifademizi çalıştırsak;
$ifade->calistir();
SQL Injection’dan korunmuş oluruz.
Peki Nasıl?
Öncelikle asıl cümlemiz bu:
SELECT * FROM uyeler WHERE id = ?
Yani:
SQL Yorumlayıcısı sql cümlesini yorumlarken (derlerken) sadece bu cümleyi derleyecek. ? yerine gelecek herhangibir değer yorumlayıcı tarafından yorumlanmayacak. Orası yorumlanmadığı için orada SQL ile ilgili herhangibirşey olsa da o sadece bir değer, bizim SQL parçamız ile alakası yok. Bu şekilde SQL Injection‘dan korunmuş oluruz.
Performans konusuna geri dönüş
Görüldüğü gibi hazirla
ile ifademiz hazırlandı şimdi birden fazla kez nasıl çağırırız bakalım
$ifade->bagla(2);
$ifade->calistir();
$ifade->bagla(3);
$ifade->calistir()
$ifade->bagla(4);
$ifade->calistir();
görüldüğü gibi $ifade
bir kez derlendi ancak 1den fazla kez çalıştırıldı bu da bize performans kazandırdı. İyi çalışmalar.
soruma verdiginiz hizli ve ayrintili cevap icin tsk ederim
rica ederim iyi çalışmalar 🙂
Pratik ve anlaşılır anlatım. Teşekkürler. WordPress’te PDO kullanma kararı aldı.
Belkide bu adımla mysql dışındaki veritabanlarına da destek verirler.
Peki PDO ile SQL injection tamamen bitti mi? Yani bu olay injection’ı %100 engelledi mi yoksa güvenliği biraz daha mı artırdı? Teşekkürler.
PDO ile prepared statements kullanırsanız tamamen bitti diyebiliriz.
Elinize sağlık gerçekten açıklayıcı olmuş.