WordPress için yazılmış binlerce eklenti bulunmakta. Bunların birçoğu veritabanını kullanmaktadır. Bu durum eğer doğru bir programlama yapılmamışsa güvenlik açıklarına neden olabilmektedir. En basitinden geçenlerde birçok WordPress kullanıcısının kullandığın All in One SEO eklentisinde çok basit bir açık ortaya çıkmış, saldırgan özel bir bağlantı ve exploit hazırlayarak, sitesine giriş yapmış bir yöneticiye bu bağlantıyı tıklattığında sitede değişiklik yapabiliyordu. Halbuki çözüm basitti ki geliştirici kendisine açık ile ilgili bilgi vermemin hemen birkaç saat sonrasında eklentiyi güncelleştirdi. Eklenti geliştiricisi olarak güvenli bir eklenti nasıl geliştirebiliriz ya da bir eklentinin güvenilirliğini nasıl test edebiliriz?
Her zaman olduğu gibi WordPress bu konuda bize çok harika fonksiyonlar ve yöntemler sunuyor.
Form İşlemlerinde Güvenlik
Eklentilerimizde çoğu zaman bilgilerimizi formlar aracılığıyla gönderir ve işleriz. Gelen bilgilerdeki kötü kodları filtreleme fonksiyonlarını kullanarak ayıklarız. Burada problem yok, kullanıcıya güvenmemek web programlamanın esaslarındandır zaten. Asıl problem gelen bilgilerin nereden geldiğidir. Formdan gelen bilgiler gerçekten site sahibi tarafından mı yollanmış yoksa bir saldırgan tarafından hazırlanmış özel bir formdan, başka bir kaynaktan mı gönderilmiş? Buna karşı nasıl önlem alabiliriz?
wp_nonce_field() Fonksiyonu
Şu an bir eklenti üzerinde çalışıyorum. Eklentimde bilgileri eklemek için aşağıdaki gibi bir form kullanıyorum. Gördüğünüz gibi form standart bir eklenti formu, herhangi bir güvenlik önlemi yok.
- <form method="post" action="">
- <table class="form-table">
- <tr valign="top">
- <th><label for="mesaj">Bugün Öğrendiğiniz Bilgi: </label></th>
- <td><textarea name="mesaj" id="mesaj" rows="5" cols="40"><?php echo $mesaj;?></textarea></td>
- </tr>
- <tr valign="top">
- <th scope="row"><label for="tarih">Tarih:</label></th>
- <td><input name="tarih" type="text" id="tarih" value="<?php echo $tarih; ?>" size = "11" /> tarihinde yayımla. (Gün.Ay.Yıl)</td>
- </tr>
- </table>
- <input type="hidden" name="action" value="ekle" />
- <p class="submit">
- <input type="submit" class="button-primary" name="Submit" value="<?php _e('Add') ?>" />
- </p>
- </form>
Bu formu gönderip, gelen bilgileri basit sorgularla kontrol edip alabilirsiniz. Ancak buradaki formu bir saldırgan taklit edip, sanki biz göndermişiz gibi zararlı bilgiler yollayabilir. Buna engel olmak için sadece bizim sitemiz tarafından gönderilebilecek bir form elemanını formumuzun içerisine eklemek ve gönderdikten sonra bunu kontrol etmek gerekiyor. İşte WordPress bize bunu yapmamızda yardımcı olacak bir fonksiyon sunuyor o da wp_nonce_field() fonksiyonu olup, fonksiyonun yaptığı iş siteye özgü rastgele bir değere sahip bir alan oluşturmak. Fonksiyonu formunuz içerisinde herhangi bir yere aşağıdaki koddaki gibi ekleyebilirsiniz.
- <form method="post" action="">
- <table class="form-table">
- <tr valign="top">
- <th><label for="mesaj">Bugün Öğrendiğiniz Bilgi: </label></th>
- <td><textarea name="mesaj" id="mesaj" rows="5" cols="40"><?php echo $mesaj;?></textarea></td>
- </tr>
- <tr valign="top">
- <th scope="row"><label for="tarih">Tarih:</label></th>
- <td><input name="tarih" type="text" id="tarih" value="<?php echo $tarih; ?>" size = "11" /> tarihinde yayımla. (Gün.Ay.Yıl)</td>
- </tr>
- </table>
- <input type="hidden" name="action" value="ekle" />
- <?php wp_nonce_field("yg_neogrendim_ekle"); ?>
- <p class="submit">
- <input type="submit" class="button-primary" name="Submit" value="<?php _e('Add') ?>" />
- </p>
- </form>
Koddaki kullanımdan da anlaşılacağı üzere, fonksiyon sizin vereceğiniz bir parametre alıyor. Parametre olarak istediğiniz bir ifade yazabilirsiniz. WordPress verdiğimiz bu parametreyi kullanarak, kendi içerisinde bir değişken tanımlayacak. Formu gönderdikten sonra ise bunu kontrol edeceğiz. Yukarıdaki kullanım sonucunda, fonksiyonu çağırdığımız yerin kaynak kodlarına baktığımızda aşağıdaki gibi form elemanlarının eklenmiş olduğunu göreceksiniz.
- <input type="hidden" id="_wpnonce" name="_wpnonce" value="110a113bde" />
- <input type="hidden" name="_wp_http_referer" value="/wp28/wp-admin/edit.php?page=yg_bugun_ne_ogrendim.php" />
Gördüğünüz gibi _wpnonce ve _wp_http_referer adında iki gizli form elemanı, formumuza eklenmiş oldu. Elbette ki işimiz henüz bitmedi, kullanıcı formu doldurduktan sonra, formun kaynağını kontrol etmemiz gerekiyor.
check_admin_referer Fonksiyonu
Yukarıdaki formdan bilgi geldiğinde normalde yapılacak işlem 'action' isimli form elemanının değerine göre ilgili fonksiyonu çağırmaktır. Bunu da genelde aşağıdaki gibi bir kod ile yaparız.
- $action = $_POST['action'];
- if ($action == 'ekle') {
- ekleme_fonksiyonumuz();
- …
wp_nonce_field fonksiyonu eklediğimiz formdan gelen bilgilerin gerçekten, eklentinin ait olduğu siteden mi geldiğini ise check_admin_referer fonksiyonu ile kontrol ediyoruz. Bunu da kodumuzu aşağıdaki hale getirerek kolayca yapabiliriz.
- $action = $_POST['action'];
- if ($action == 'ekle') {
- check_admin_referer( 'yg_neogrendim_ekle' );
- ekleme_fonksiyonumuz();
- …
Dikkat ederseniz check_admin_referer fonksiyonuna girdiğimiz parametre değeri ile formumuzda kullandığımız wp_nonce_field fonksiyonuna girdiğimiz parametre değeri aynı. check_admin_referer fonksiyonu formdan gelen bilgiyi kontrol edecek eğer bu bilgi yoksa ya da sitede üretilmemişse WordPress'in çalışmasını durduracaktır.
Gördüğünüz gibi iki küçük fonksiyonla, eklentimizdeki formları kolayca güvenli hale getirmiş olduk. Ne yazık ki birçok eklentide, bu fonksiyonları kullanmamaktan kaynaklanan güvenlik açıkları mevcut. Kullandığınız eklentilerde, form ile veri girişi varsa, eklentinin kaynak kodlarını inceleyip, bu fonksiyonların kullanılıp, kullanılmadığını kontrol ediniz. Eğer bunlar yoksa ziyaretçilerinizden gelen (genellikle yorumlardaki) her bağlantıya güvenip, tıklamayın.
Formlarımız şimdi biraz daha güvenli ancak benzer işlemleri örneğin bir yazıyı silmekte kullandığımız 'Sil' bağlantılarını nasıl güvenli hale getireceğiz?
Bu yazının kısa bağlantısı http://www.yakupgovler.com/?p=932.
Yazılarımı RSS aboneliği ile takip edebilir, yeni yazılarıma kolaylıkla ulaşabilirsiniz. Bunun için ise RSS adresimi kullanabilirsiniz.
Tarih: 21 Temmuz 2009 Saat: 08:28
Eklenti geliştiricilerin işine yarayacak süper ipuçları vermişsin, eline sağlık.