php variables globales / Register global
Recommandation
Il est recommandé de ne pas utiliser de variables globales (aka global register, register_global),
Doc
Formulaires HTML (GET et POST)
Utilisation des variables super-globales
Emulation
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(); ?>
Comment savoir quels fichiers sont concernés?
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
Astuces pour tester
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; ?>