php variables globales / Register global

Il est recommandé de ne pas utiliser de variables globales (aka global register, register_global),

Variables pré-définies

Formulaires HTML (GET et POST)

Utilisation des variables super-globales

http://www.nexen.net/docs/php/annotee/faq.misc.registerglobals.php register_globals

Emulation des Register Globals

Ceci émulera la directive register_globals à On .

<?php
// Emulation de register_globals à on
if (!ini_get('register_globals')) {
    $superglobals = array($_SERVER, $_ENV,
        $_FILES, $_COOKIE, $_POST, $_GET);
    if (isset($_SESSION)) {
        array_unshift($superglobals, $_SESSION);
    }
    foreach ($superglobals as $superglobal) {
        extract($superglobal, EXTR_SKIP);
    }
}
?>

Ceci émulera register_globals à Off. Gardez à l'esprit que ce code doit être appelé au tout début de votre script.

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

    // Vous pouvez vouloir modifier cela pour avoir une erreur plus jolie
    if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS'])) {
    die('Tentative d\'effacement des GLOBALS détectée');
    }

    // Les variables à ne jamais effacer
    $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();
?> 

Voici le script unix que j'utilise:

#identifier fichiers concernés
#chercher variables
find . -name "*.php*" -exec egrep -l '\$' {} > _php_global_register_files \;
#chercher variables correctement declarees, eg. $_GET, $_POST etc.
find . -name "*.php*" -exec egrep -l '\$_[A-Z]' {} > t_ \;
#extraire variables $_ de toutes les variables $
diff _php_global_register_files t_ > t__ & mv t__ _php_global_register_files
#mise en forme
sed 's|^> ||g' _php_global_register_files > t_ && mv t_ _php_global_register_files

Astuce 1

AllowOverride all

puis dans Directory ajouter .htaccess avec
php_flag register_globals off

Astuce 2

Dans ce script vous devez modifier la récupération des valeurs passées par vos scripts html.

Côté php:
Ajouter cette ligne en début de script php:

import_request_variables("GP", "v_");

Après l'interprétation de cette ligne vous êtes en mesure
d'utiliser vos variables et leurs contenu:

$v_toto contient la donnée de toto passée par le POST effectué.

Le paramètre GP indique que vous pouvez passer par GET ou POST,
cette fonction accepte les deux modes.

Remarque: vous pouvez accéder à toutes vos valeurs que votre script
envoie:

$v_toto
$v_tata
$v_titi

ect...
MANUEL PHP:

Description
bool import_request_variables ( string types [, string prefix] )

import_request_variables() importe les variables GET/POST/Cookie dans
l'environnement global. C'est pratique si vous avez désactivé register_globals,
mais que vous voulez enregistrer des variables dans l'environnement global.

En utilisant le paramètre types, vous pouvez spécifier les variables que vous
voulez importer. Vous pouvez utiliser 'G', 'P' et 'C' pour désigner
respectivement GET, POST et Cookie. Ces caractères ne sont pas sensibles à la
casse, et vous pouvez les combiner entre eux. POST inclut les fichiers
téléchargés. Notez que l'ordre des lettres est important. En utilisant par
exemple "GP", les variables de POST écraseront par les variables de GET, ayant
le même nom. Toute lettre autre que G, P ou C, est ignorée.

Le paramètre prefix est utilisé comme un préfixe de nom de variable, qui sera
ajoutée au début de tous les noms de variables importées. Si vous avez par
exemple une variable GET du nom de "userid", et utilisez le préfixe "pref_", la
variable ainsi générée s'appellera $pref_userid.

Si vous souhaitez importer d'autres variables dans l'environnement global, comme
$_SERVER, considérez l'utilisation de la fonction extract().

Note : Bien que le paramètre prefix soit optionnel, il sera généré une
alerte E_NOTICE si vous ne spécifiez pas de préfixe, ou si vous utilisez une
chaîne vide comme préfixe. C'est potentiellement un trou de sécurité. Les
alertes de ce niveau ne sont pas affichées si vous utilisez le niveau d'erreur
par défaut.

Exemple 1. Exemple avec import_request_variables()

// Ce code va importer les variables GET et POST
// avec un préfixe "rvar_"
import_request_variables("gP", "rvar_");

echo $rvar_foo;
?>
  • info/php_variables_globales.txt
  • Dernière modification: 2018/07/18 09:46
  • par radeff