Domanda

Non sono sicuro che sarebbe bello essere contrassegnato come wiki della comunità, ma comunque:

C'è un modo semplice per uccidere il registro_globals? Sto lavorando su un framework PHP e in questo momento, ho semplicemente impostato lo script per terminare se register_globals è acceso. Anche se preferisco costringere le persone a disabilitarlo, lì sono server che lo hanno ancora.

So che in PHP 5.3.0 Register_Globals è deprecato e in PHP 6 sarà completamente rimosso, ma è sempre una buona cosa affrontarlo mentre è ancora qui.

Ho visto alcuni modi e attualmente sto pensando di usare questo:

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

Ci sono alcuni problemi qui, però. È un incentivo delle risorse, specialmente quando ci sono molti dati di input. Non sono sicuro se la disabilitazione in fase di esecuzione funzionerebbe, ad esempio:

ini_set('register_globals', 'Off')

Esiste un modo migliore di cui non ho sentito parlare per sbarazzarmi di Register_Globals? Grazie.

È stato utile?

Soluzione

Esistono metodi per trattare con register_globals descritto nel manuale PHP. Il register_globals Impostazione INI Non posso essere impostato in fase di esecuzione di ini_set(), quindi se non puoi farlo con un file di configurazione .htaccess o server Web, il metodo fornito ci sarebbe la soluzione ufficiale.

Fondamentalmente fornisce questo frammento di codice per emulare la compatibilità:

<?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();

?>

Altri suggerimenti

Potresti aggiungere php_flag register_globals off al tuo file .htaccess, sebbene non tutti i server lo accettino. Quindi, se hai intenzione di pubblicare il tuo framework, potrebbe non essere una buona idea.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top