register_globals Kullanımı

Uyarı

Bu özelliğin kullanımı PHP 5.3.0 itibariyle ÖNERİLMEMEKTE olup PHP 5.4.0'da tamamen KALDIRILMIŞTIR.

PHP'deki belki de en tartışmalı değişiklik, register_globals PHP yönergesinin öntanımlı değerinin PHP » 4.2.0'da On iken Off yapılmasıdır. Bu yönerge üzerindeki geçmiş deneyimlere dayanmak oldukça yaygındı ve çoğu kişi yönergenin varlığını bile bilmediği gibi PHP'nin böyle çalıştığını varsayardı. Bu sayfada, bu yönerge ile yazılan kodun nasıl güvensiz olabileceği gösterilecek, fakat güvensizliğin yönergenin kendisinden ziyade nasıl yanlış kullanımından kaynaklandığı açıklanacaktır.

register_globals On iken, HTML formlarındaki istek değişkenleri gibi bir takım değişkenler betiğinize dahil edilir. PHP'nin değişken ilklendirme gerektirmeme olgusu güvensiz kod yazımını daha da kolaylaştırır. Zor bir karar olmasına rağmen PHP topluluğu bu yönergeyi öntanımlı olarak iptal etmeyi uygun gördü. Yönergenin değeri On iken, kullanıcılar, değişkenleri, aslında ne olup bittiğini bilmeden sadece varsayımla kullanırdı. Betiğin kendisi tarafından tanımlanmış dahili değişkenler kullanıcı tarafından gönderilen istek verileri ile karışırdı. register_globals Off yapılınca bu değişti. Yönergenin yanlış kullanımını bir örnekle açıklamaya çalışalım:

Örnek 1 - register_globals = on ile yanlış kullanım örneği

<?php
// Sadece kullanıcı kimliği doğrulanıyorsa $yetkili = true olmalı
if (authenticated_user()) {
    
$yetkili true;
}

// $yetkili değişkenini başta false ile ilklendirmediğimizden
// bu atama GET auth.php?yetkili=1 şeklinde register_globals
// üzerinden yapılmış olabilir. Dolayısıyla, kullanıcı kendini
// yetkiliymiş gibi gösterebilir!
if ($yetkili) {
    include 
"/gayet/hassas/veriler.php";
}
?>

register_globals = on iken yukarıda yürüttüğümüz mantık zarar görebilir. register_globals = off olduğunda, $yetkili değişkenine istek üzerinden değer atanamayacağından bir açık söz konunu olmayacaktır. Aslında değişkenleri baştan ilklendirmek iyi bir programcılık alışkanlığıdır. Yukarıdaki örnekte baştan $yetkili = false yapabilirdik. Bu ilklendirme yapılmış olsaydı, kullanıcı öntanımlı olarak yetkisiz olacağından register_globals yönergesinin değerinin ne olduğunun bir önemi olmayacaktı.

Diğer bir örnek oturumlarla ilgilidir. register_globals = on iken, aşağıdaki örnekte $kullanici değişkenini de kullanabilirdik, fakat tekrar hatırlatmakta yarar var: $kullanici, GET gibi başka bir kaynaktan da (örn, URL üzerinden) gelebilirdi.

Örnek 2 - register_globals On veya Off iken oturum örneği

<?php
// $kullanici'nin nereden geleceğini bilemezdik
// Fakat oturum verisi için $_SESSION kullanınca biliriz
if (isset($_SESSION['kullanici'])) {

    echo 
"Merhaba <b>{$_SESSION['kullanici']}</b>";

} else {

    echo 
"Merhaba <b>Ziyaretçi</b><br />";
    echo 
"Oturum açmak ister misiniz?";

}
?>

Sahtecilik yapılmaya çalışıldığında uyaracak önleyici tedbirler almak da mümkündür. Bir değişken vaktinden önce geliyorsa, gönderilen verinin ilgisiz bir teslimat çeşidinden gelip gelmediğini sınayabilirsiniz. Verinin sahte olmadığını garanti etmese de saldırganın yaptığı sahtecilik türünün tahmin edilmesi gerekir. İstek verisinin geldiği yeri önemsemiyorsanız, GET, POST ve COOKIE verilerinin bir karışımını içeren $_REQUEST dizisini kullanabilirsiniz. Ayrıca, Dış Kaynaklı Değişkenler bölümüne de bakınız.

Örnek 3 - Basit değişken sahteciliğinin saptanması

<?php
if (isset($_COOKIE['MAGIC_COOKIE'])) {

    
// MAGIC_COOKIE bir çerezden gelir.
    // Çerez verisini doğrulamayı unutmayın!

} elseif (isset($_GET['MAGIC_COOKIE']) || isset($_POST['MAGIC_COOKIE'])) {

   
mail("[email protected]""Olası kırma çabası"$_SERVER['REMOTE_ADDR']);
   echo 
"Güvenlik ihlali; yönetici uyarıldı.";
   exit;

} else {

   
// MAGIC_COOKIE bu istek (REQUEST) üzerinden atanmamış.

}
?>

Şüphesiz, tek başına register_globals = off, kodunuzun güvenli olduğu anlamına gelmez. Gönderilen her veri parçası başka yollarla da ayrıca sınanmalıdır. Kullanıcı verinizi daima doğrulayın ve değişkenlerinizi daima ilklendirin! İlklendirilmemiş değişkenleri görmek için error_reporting() işlevi ile E_NOTICE seviyesinden hataların gösterilmesini sağlamalısınız.

register_globals'in On veya Off olmasının taklit edilmesi hakkında bilgi edinmek için SSS'deki register_globals ile nasıl çalışacağım? sorusuna bakınız.