Pazar, 18 Aralık 2011

Kullanıcı Girişlerinin Filtrelenmesi

 

Kullanıcılardan gelen veriyi temizlemek için filtrelerden geçiririz. Xss_clean() filtresi form doğrulama sırasında en çok kullandığımız filtrelerden biridir.

Ancak bu filtre, içinde & işareti (ampersand) geçen kullanıcı girdilerinde, kelimenin sonuna noktalı virgül işareti eklemektedir. Örneğin içinde "P&ID files" gibi bir ibare geçen kullanıcı girdisi, şuna dönüşmektedir: "P&ID; files".

Aynı şekilde eğer kullanıcı şifre girerken içinde & işareti geçen bir şifre oluşturuyorsa, xss_clean() filtresinden geçirilen bu şifreyi formumuz hiçbir zaman doğrulamayacaktır.

Bunu önlemek için xss_clean filtresini global olarak açtıysanız kapatmalısınız. Bu nedenle, application/config/config.php dosyasında ilgili satır şöyle olmalıdır:

$config['global_xss_filtering'] = FALSE;

Şifreyi formdan çektiğinizde de xss_clean filtresi yerine strip_tags filtresini kullanabilirsiniz:

$this-<form_validation-<set_rules('username', 'Username', 'required|strip_tags|max_length[20]');

$this-<form_validation-<set_rules('password', 'Password', 'required|strip_tags|max_length[20]');

Bu yazıda bahsedilen sorun CodeIgniter 1.7.2 ve 2 üzerindeki tüm versiyonlarında tespit edilmiştir.

Bu yazı Kevin Philips'in yazısı kullanılarak hazırlanmıştır.

Yorumlar

güzel bir yazı.
konunun biraz daha detayına inerek birkaç ekleme yapayım.
bu konu core security sınıfının (/system/core/Security.php) validate_entities() fonksiyonundaki aşağıdaki satırdan kaynaklanıyor (validate_entities() fonksiyonu aynı sınıfın xss_clean() fonksiyonunda kullanılıyor);
$str = preg_replace('#(&\#?[0-9a-z]{2,})([\x00-\x20])*;?#i', "\\1;\\2", $str);
Ver 2.1.0 da 792. satır..
bu satır, yukarıdaki yazında belirttiğin gibi, (GET ile gelen) içinde & geçen kelimelerin sonuna ; ekliyor.
xss_clean fonksiyonunu kullanmak isteyen ama bu sorundan kurtulmak isteyenler,
security.php içindeki xss_clean() fonksiyonundaki $str = $this->_validate_entities($str); satırını aşağıdaki satırla değiştirebilir;
$str = preg_replace('|\&([a-z\_0-9\-]+)\=([a-z\_0-9\-]+)|i', $this->xss_hash()."\\1=\\2", $str);

yazında senin verdiğin çözümün yerine, core kütüphaneyi extend edip kendi sınıfını yazarak sorunu aşmak isteyenler, bu bahsettiğim noktadan başlayabilirler. daha detaylı örnek için;
http://www.phpkode.com/source/p/pyrocms/pyrocms-pyrocms-fc6071c/system/pyrocms/libraries/MY_Security.php
bu linkteki sınıf olduğu gibi alınıp kullanılarak,yazına konu olan sorun ortadan kaldırılabilinir.

kolay gelsin...

Yorum Ekle