"Register Globals" Kapalı İken "Predefined Variables" ların Çalışır Hale Gelmesi

Phpnin eski versiyonlarında ve 4.1.0 üzeri versiyonlarında (register_globals_off durumunda ) GET,POST,SESSION gibi işlemlerinizde değişkenlerinizi tanımlamanız gerekmektedir.Teker teker yazmaktan sizleri kurtarmak için bir array işlemi yapalım.

Php.4.1.0 üzerindeki versiyonlarda "register_globals_off" durumunda iken ya da daha eski versiyonlarda mesela formdan gelen bir değişkeni tanımlarken;


$degisken = $_POST['degisken'] ;

$degisken = $_GET['degisken'] ;



gibi tanımlamamız gerekmektedir.

Aslında bu şekilde olması sistemimizin güvenliği açısından çok mantıklı bir uygulamadır ve tavsiye edilen bir uygulamadır.

Ancak devamlı bu şekilde yazmak ya da mevcut bir sistemde "register_globals_on" şeklinde uyarlanmış ise bu sizin canınızı sıkabilir.Bunun için tüm GET,POST,SESSION vb. işlemlerine kolay yoldan bir çözüm yolu üretelim;


if (!isset($_GET)) { $_GET = &$HTTP_GET_VARS;}

if (!isset($_POST)) { $_POST = &$HTTP_POST_VARS;}

if (!isset($_SESSION)) { $_SESSION = &$HTTP_SESSION_VARS;}

if (!isset($_SERVER)) { $_SERVER = &$HTTP_SERVER_VARS; }

if ( !isset($_ENV)) { $_ENV = &$HTTP_ENV_VARS;}

if ( !isset($_COOKIE)) { $_COOKIE = &$HTTP_COOKIE_VARS;}

if ( !isset($_FILES)) { $_FILES = &$HTTP_POST_FILES;}

if ( !isset($_REQUEST)) { $_REQUEST = &$_GET&$_POST&$_COOKIE&$_FILES;}



// Daha sonra extract komutu ile tüm predefined variables ları çıkartıyoruz ve uygulama aşamasına geçiriyoruz.



if (isset($_GET)) { extract($_GET); }

if (isset($_POST)) { extract($_POST); }

if (isset($_SESSION)) { extract($_SESSION); }

if (isset($_SERVER)) { extract($_SERVER); }

if (isset($_ENV)) { extract($_ENV); }

if (isset($_COOKIE)) { extract($_COOKIE); }

if (isset($_FILES)) { extract($_FILES); }

if (isset($_REQUEST)) { extract($_REQUEST); }



ya da array işlemi ile bu işlemi daha basit bir şekilde yapabiliriz.Bu kısım Joomla içerik sisteminin kodlamış olduğu globals.php kısmından alıntı yapılarak düzenlenmiştir.



$degiskenliste = array("_GET", "_POST", "_COOKIE", "_SERVER"); foreach($degiskenliste as $globalliste){

$listele = array_keys($$globalliste);

foreach($listele as $liste){

$$liste = trim(${$globalliste}[$liste]);

}

}



şeklinde array komutu ile yapabileceğimiz gibi ;

// Bu kısım Joomla içerik sistemi globals.php dosyasından alıntı yapılarak düzenlenmiştir.


define( 'registerayari', 1 ); // Öncelikle register globals "on" ya da "off" durumunu belirliyoruz.Eğer burada registerayari "1" ise register globals "off" modundadır ve "on" moduna çevireceğiz demek istiyoruz.



//Spoofing yöntemiyle saldırıyı engellemek için fonksiyon yazalım



function checkInputArray( &$array, $globalise=false ) {

    static $banned = array( '_files', '_env', '_get', '_post', '_cookie', '_server', '_session', 'globals' );



    foreach ($array as $key => $value) {

        if (in_array( strtolower( $key ), $banned ) ) {

            die( 'Geçersiz Değişken <b>' . implode( '</b> or <b>', $banned ) . '</b> passed to script.' );

        }

        if ($globalise) {

            $GLOBALS[$key] = $value;

        }

    }

}



// Register globals modunu off durumuna çevirmek için bir fonksiyon yazalım;



function unregisterGlobals () {

    checkInputArray( $_FILES );

    checkInputArray( $_ENV );

    checkInputArray( $_GET );

    checkInputArray( $_POST );

    checkInputArray( $_COOKIE );

    checkInputArray( $_SERVER );



    if (isset( $_SESSION )) {

        checkInputArray( $_SESSION );

    }



    $REQUEST = $_REQUEST;

    $GET = $_GET;

    $POST = $_POST;

    $COOKIE = $_COOKIE;

    if (isset ( $_SESSION )) {

        $SESSION = $_SESSION;

    }

    $FILES = $_FILES;

    $ENV = $_ENV;

    $SERVER = $_SERVER;

    foreach ($GLOBALS as $key => $value) {

        if ( $key != 'GLOBALS' ) {

            unset ( $GLOBALS [ $key ] );

        }

    }

    $_REQUEST = $REQUEST;

    $_GET = $GET;

    $_POST = $POST;

    $_COOKIE = $COOKIE;

    if (isset ( $SESSION )) {

        $_SESSION = $SESSION;

    }

    $_FILES = $FILES;

    $_ENV = $ENV;

    $_SERVER = $SERVER;

}



//Register globals modunu "on" moduna çevirmek için bir fonksiyon yazalım



function registerGlobals() {

    checkInputArray( $_FILES, true );

    checkInputArray( $_ENV, true );

    checkInputArray( $_GET, true );

    checkInputArray( $_POST, true );

    checkInputArray( $_COOKIE, true );

    checkInputArray( $_SERVER, true );



    if (isset( $_SESSION )) {

        checkInputArray( $_SESSION, true );

    }



    foreach ($_FILES as $key => $value){

        $GLOBALS[$key] = $_FILES[$key]['tmp_name'];

        foreach ($value as $ext => $value2){

            $key2 = $key . '_' . $ext;

            $GLOBALS[$key2] = $value2;

        }

    }

}



//Daha sonra çıktımızı alalım



if (registerayari == 0) {

    // register gloal durumunu "off" moduna çeviren fonksiyonu çalıştırır

    unregisterGlobals();    

} else if (ini_get('register_globals') == 0) {

    // php.ini dosyamızdaki register_globals durumuna bakar ve off yani 0 ise "on" moduna geçecek fonksiyonu çalıştırır

    registerGlobals();

} else {

    // php.ini dosyamızdaki register_globals durumuna bakar ve on olduğunu görürse spoofine karşı önlemini alır.

    checkInputArray( $_FILES );

    checkInputArray( $_ENV );

    checkInputArray( $_GET );

    checkInputArray( $_POST );

    checkInputArray( $_COOKIE );

    checkInputArray( $_SERVER );



    if (isset( $_SESSION )) {

        checkInputArray( $_SESSION );

    }

}

  • Etiketler;
Yorum Yaz

Yorum yazabilmek için üye girişi yapmanız gerekiyor!

Ders gerçekten güzel olmuş eline sağlık ama ufak bir ekleme yapayım register globals kapalı sunucularda hostunuza bir .htaccess oluşturarak [code]php_flag register_globals on[/code] içine bu kodları yazarak register globalsı açabilirsiniz.
Evet bu şekilde de yapılabilir ancak sunucunun yorulacağını tahmin ediyorum bu şekilde. Kolay gelsin

Yukarı Git