Ana Sayfa » »
Tem
26
2013

WordPress $wpdb Sınıfı: prepare() ile Veritabanı Güvenliği

WordPress eklentilerimizde veritabanı işlemleri yapacaksak, güvenlik birinci önceliğimiz olmalı. SQL injection (enjeksiyon) denilen bir saldırı türünde saldırganlar veritabanına zararlı kodlar eklemeye çalışarak, siteyi ele geçirmeye ya da siteye zarar vermeye çalışırlar. WP'nin kendisinde bu tarz saldırılar için önlemler alınmıştır ancak kullanılan eklentilerdeki veritabanı işlemleri için güvenlik önlemi alınmamışsa site tehlikeye düşebilir.

Aslında WordPress bize verileri zararsız hale getirmek için çeşitli fonksiyonlar sunuyor, bunlardan $wpdb sınıfının prepare() fonksiyonu veritabanı işlemlerimizde güvenlik sağlayan en önemli fonksiyondur. prepare() fonksiyonu kendisine verilen SQL kodunu alır, içerisindeki değişkenlerin türlerine göre gerekli değişiklikleri yapar ve sonuçta güvenli bir SQL cümlesi oluşturulmuş olur.
Fonksiyonun genel kullanımı $wpdb->prepare($sqlcumlesi, $degiskenler, $degiskenler, ...); şeklindedir. Aşağıdaki örneklerde çeşitli SQL cümlelerini güvenli hale getirmek gösterilmiştir.

<?php
//Aşağıdaki örnek 15 nolu yazıya sanatci adında değeri "Mahmut Tuncer olan bir özel alan bilgisi ekler
$sql = $wpdb->prepare("INSERT INTO $wpdb->postmeta ('post_id', 'meta_key', 'meta_value') VALUES ( %d, %s, %s)", 15, 'sanatci', 'Mahmut Tuncer');
//$sql değişkeninin değeri aşağıdaki gibi olur
//$sql = "INSERT INTO $wpdb->postmeta ('post_id', 'meta_key', 'meta_value') (15, 'sanatci', 'Mahmut Tuncer')";
$wpdb->query( $sql );

//Aynı SQL cümlesini değişkenlerle de oluşturmak mümkün
$post_id = 15;
$metakey = 'sanatci';
$metavalue = 'Mahmut Tuncer';
$sql = $wpdb->prepare ( "INSERT INTO $wpdb->postmeta ('post_id', 'meta_key, 'meta_value') VALUES ( %d, %s, %s )", $post_id, $metakey, $metavalue);
$wpdb->query( $sql );

//Aşağıdaki örnek yorum sayısı 50'den fazla olan yazıların ID ve Başlıklarını seçer.
$sql = $wpdb->prepare( "SELECT ID, post_title FROM $wpdb->posts WHERE comment_count > %d AND post_status = %s AND post_type = %s ORDER BY comment_count DESC", 50, 'publish', 'post' );
$yazilar = $wpdb->query( $sql );
?>

Ancak size tavsiyem zorunlu olmadıktan sonra örnekte olduğu gibi query() fonksiyonu ile işlem yapmak yerine eğer ekleme işlemi yapacaksanız, $wpdb sınıfının insert(), güncelleme yapacaksanız update(), silme yapacaksanız da delete() fonksiyonlarını kullanmanız yönündedir. Ancak yine de tercih sizin. Bu arada özellikle formlardan bilgi okurken siz yine de değişken değerlerini WordPress'in doğrulama fonksiyonlarını kullanarak zararsız hale getirmeyi unutmayın.

Bu yazımı beğendiyseniz, bu kategoride yer alan WordPress $wpdb Sınıfı: DELETE (Silme) İşlemleri başlıklı fonksiyon, query ve sql konularında bilgi veren bir önceki yazımı da okumanızı tavsiye ederim.

Yorumunu Yaz

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Yukarı Çık