Question

Je ne sais pas si ce serait bien d'être marqué comme un wiki communautaire, mais de toute façon:

Existe-t-il un moyen facile de tuer le registre_globals? Je travaille sur un framework PHP et en ce moment, je définis le script pour terminer si Register_Globals est allumé. Bien que je préfère forcer les gens à le désactiver, là sommes des serveurs qui ont encore cela.

Je sais que dans PHP 5.3.0 registre_globals est obsolète et dans PHP 6, il sera complètement supprimé, mais c'est toujours une bonne chose de le gérer pendant qu'il est encore là.

J'ai vu des façons et je pense actuellement à l'utiliser:

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

Il y a cependant quelques problèmes ici. C'est une incitation aux ressources, surtout lorsqu'il y a beaucoup de données d'entrée. Je ne sais pas si le désactivation de l'exécution fonctionnerait, par exemple:

ini_set('register_globals', 'Off')

Existe-t-il une meilleure façon dont je n'ai pas entendu parler pour me débarrasser de Register_Globals? Merci.

Était-ce utile?

La solution

Il existe des méthodes de traitement avec registre_globals décrit dans le manuel PHP. La register_globals INI Impossible d'être défini au moment de l'exécution par ini_set(), donc si vous ne pouvez pas le faire avec un fichier .htaccess ou de configuration de serveur Web, la méthode fournie y aurait la solution de contournement officielle.

Il fournit essentiellement cet extrait de code pour imiter 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();

?>

Autres conseils

Tu pourrais ajouter php_flag register_globals off À votre fichier .htaccess, bien que tous les serveurs ne l'acceptent pas. Donc, si vous prévoyez de publier votre cadre, ce n'est peut-être pas une bonne idée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top