Salı, 14 Temmuz 2009

Adres Satırından Bilgi Çekmek

 

Site genelinde adres satırı üzerinden değişken aktarma ihtiyacı hissettiğimiz durumlar olduğunda geneleneksel metod olarak $_GET fonksiyonunu kullanırız. Örneğin sayfa numaraları aktarma, ya da kullanıcı oturum (session) bilgisi buna örnektir. Ancak bu fonksiyon, XSS denilen (cross side scripting) bazı güvenlik açıklarına karşı korumasızdır.

CodeIgniter ile adres satırından veri aktarmak için öncelikle application/config dizini altındaki config.php dosyamız içindeki $config['enable_query_strings'] değişkenini "TRUE" olarak değiştirmeliyiz. Ancak bu işlemden sonra adres satırı üzerinden bilgi alabiliriz. Burada şuna dikkat etmemiz gerekir: adres satırında kullandığımız değişkenler config.php dosyasında tanımlı trigger`ler olamaz (c : controller, m: model, d: directory tanımıdır).

Bu noktadan sonra adres satırından değişkenleri almak için $_GET fonksiyonunu kullanmak yerine CodeIgniter`ın Input kütüphanesini kullanmak daha faydalıdır. Input kütüphanesi açılışta yüklenen kütüphanelerden biridir. Tekrar yüklenmesine gerek yoktur.

Adres satırından çağırdığımız değişkenin adı "sayfa" olsun. Deneme.php isimli controller dosyamız application/controllers dizini altına kopyalayalım. Deneme controller dosyamızın içeriği aşağıdaki gibi olsun:

class Deneme extends Controller {

 function Deneme()
 {
  parent::Controller();
 }
 
 function index()
 {
 echo $get = $this->input->get("no");
 }

}

CodeIgniter içinden get fonksiyonu ile çağırdığım no isimli değişkeni ekrana yazdırıyorum. Controller dosyasını yükledikten sonra siteadresim.com/deneme?no= linkinin sonuna XSS cheat sheet sayfasından alacağınız bir kodu ekleyip çağırabilirsiniz.

Ekranda XSS açığı olduğunu gösteren bir uyarı mesajı göreceksiniz. Burada CodeIgniter kütüphanesinden çağırdığınız get fonksiyonu olmasına rağmen açık olmasının nedeni bizim XSS filtresini açmamış olmamızdır. Eğer ki ekrana yazdırdığımız satıra "TRUE" eklersek, ekran görüntüsü daha temiz gelecektir.

class Deneme extends Controller {

 function Deneme()
 {
  parent::Controller();
 }
 
 function index()
 {
 echo $get = $this->input->get("no",TRUE);
 }

}

Input kütüphanesi kullanırken (post için de, get için de) XSS filtresini açmak için ikinci değişkenin TRUE olması gerektiğini unutmayınız.

Yorumlar

Sağolun bilgiler için $_GET yerine yazmış olduğunuz gibi kullanmak daha güvenli oluyor :)

Bu konuda application/config.php dosyasında yer alan $config[`global_xss_filtering`] değişkenini TRUE alırsanız, get ve post ile bilgi çekerken ayrıca TRUE yazmanıza gerek kalmadan XSS filtresi uygularsınız.

URL yapımızın "site_adı/controller/method/var1/var2..." şeklinde olduğunu düşünürsek herhangi bir controller dosyasında

function method($var1,var2){...}

şeklinde aldığımız değerler için XSS kontrolü yapmamıza gerek var mı yoksa $config[`global_xss_filtering`] değerini TRUE atamamız bu konuda bize güvence sağlıyor mu?

$config[`global_xss_filtering`] değerini TRUE atamak yeterli. Tekrar kontrole gerek yoktur.

peki $config[`global_xss_filtering`] değişkenini TRUE atayınca bazı yerlerde okuduğuma göre işlemci ve ram yükü yaratabiliyormuş bu doğru mu? doğruysa da ne ölçüde etkiler?

@İlker: global_xss_filtering değişkenini TRUE atamak tabii ki işlemci ve hafıza yükünü arttıracaktır. Bundan kaçınmak için yazıda anlattığım metodu uygulayabilirsiniz.

Hocam guzel bir calisma olmus tebrik ederim..sanirim yazmayi unuttunuz config dosyasinda
$config['uri_protocol']    = "AUTO";
olan kısımda
 $config['uri_protocol']    = "PATH_INFO";
şeklinde olmalı..

Yorum Ekle