Cihat Şeker
Üye
- 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;
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.
ş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.
$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 );
}
}