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

Kayıt
7 Haziran 2008
Mesaj
533
Tepki
6
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;


Kod:
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.



Kod:
$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.
Kod:
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 );


    }


}
 
Yukarı Alt