Register_globals ile ilgilenmek

2 Cevap php

Ben bu zaten topluluk wiki, ancak olarak işaretlenmiş olması iyi olurdu emin değilim:

Register_globals öldürmek için kolay bir yolu var mı? Ben bir PHP Framework üzerinde çalışıyorum ve şu anda, ben sadece register_globals Açık ise sonlandırmak için komut dosyası ayarlamak. I are sunucular oraya, onu devre dışı bırakmak için insanları zorlamak için tercih rağmen hala üzerinde olduğunu.

PHP 5.3.0 ve register_globals önerilmiyor ve PHP 6 tamamen kaldırılmış olacağını biliyorum, ama bu her zaman hala burada iken onunla başa çıkmak için iyi bir şeydir.

Ben bazı yolları gördüm, ve ben şu anda bu kullanarak düşünüyorum:

$temp = array_merge($_GET, $_POST, $_COOKIE);
foreach($temp as $k => $v) {
    if(isset($$k)) unset($$k);
}

Bazı sorunlar olsa da, burada üzerinde bulunmaktadır. Veri girişi bir çok şey var, özellikle zaman, kaynak teşviktir. Ben zamanında bunu devre dışı bırakma, örneğin işe edip emin değilim:

ini_set('register_globals', 'Off')

Register_globals kurtulmak için duymamış daha iyi bir yolu var mı? Teşekkürler.

2 Cevap

Register_globals ile ilgili yöntemler vardır described in the PHP manual. register_globals ini ayarının can't be set at runtime ini_set() ile bu yüzden bir. Htaccess veya web sunucusu yapılandırma dosyası ile bunu yapamaz ise, yöntem olacağını temin resmi geçici çözüm.

Bu temelde uyumluluk taklit Bu kod pasajını sağlar:

<?php
// Emulate register_globals off
function unregister_GLOBALS()
{
    if (!ini_get('register_globals')) {
        return;
    }

    // Might want to change this perhaps to a nicer error
    if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS'])) {
        die('GLOBALS overwrite attempt detected');
    }

    // Variables that shouldn't be unset
    $noUnset = array('GLOBALS',  '_GET',
                     '_POST',    '_COOKIE',
                     '_REQUEST', '_SERVER',
                     '_ENV',     '_FILES');

    $input = array_merge($_GET,    $_POST,
                         $_COOKIE, $_SERVER,
                         $_ENV,    $_FILES,
                         isset($_SESSION) && is_array($_SESSION) ? $_SESSION : array());

    foreach ($input as $k => $v) {
        if (!in_array($k, $noUnset) && isset($GLOBALS[$k])) {
            unset($GLOBALS[$k]);
        }
    }
}

unregister_GLOBALS();

?>

Tüm sunucuları bu kabul karşın, senin. Htaccess dosyasına php_flag register_globals off ekleyebilirsiniz. Eğer çerçeve yayınlamayı planlıyorsanız Yani, iyi bir fikir olmayabilir.