PHP et les variables super-globales

Les variables super-globales sont passées de On à Off depuis PHP 4.2.0.

 

Variables super-globales

Lorsqu'elles sont actives, le programmeur ne sait pas exactement d'où provient le contenu de la variable, et ne peut que faire des suppositions. De ce fait la programmation de scripts comprenant des risques de sécurité est possible.

Exemple de mauvaise utilisation de register_globals = on.

<?php
// $authorized = true uniquement si l'utilisateur est identifié
if (authenticated_user()) {
$authorized = true;
}

// Comme nous n'avons pas initialisé $authorized avec false, cette dernière
// peut être définie via register_globals, comme avec l'URL GET auth.php?authorized=1
// Tout le monde peut facilement être reconnu comme identifié!
if ($authorized) {
include "/donnees/critiques/data.php";
}
?>

Lorsque register_globals est activé, la logique ci-dessus peut être prise en défaut.
Lorsque register_globals est désactivée $authorized ne peut plus être assignée via la requête, et le script est sûr.
Il reste recommandé de toujours initialiser ses variables :
Ajouter $authorized = false et le script peut fonctionner avec register_globals on ou off, les utilisateurs étant par défaut non-identifiés.

La fonctionnalité register_globals est obsolète et dangereuse, elle a été supprimée depuis PHP6.

Un autre exemple avec les sessions.
Lorsque register_globals est activé, on peut aussi utiliser $username mais il faut garder en tête que $username peut provenir d'autres biais, tels que GET (via l'URL).

Exemple d'abus de sessions avec register_globals à on ou off.

<?php
// Nous ne savons pas d'où provient $username mais nous savons que $_SESSION contient les données de session
if (isset($_SESSION['username'])) {
echo "Bonjour <strong>{$_SESSION['username']}</strong>";
} else {
echo "Bonjour <strong>visiteur</strong><br />";
echo "Voulez-vous vous identifier?";
}
?>

Il est possible de prendre des mesures préventives pour être alerté lorsqu'une tentative d'usurpation est faite.
Si vous savez à l'avance de quelle variable le nom d'utilisateur doit provenir, vous pouvez vérifier si les données que vous manipulez sont d'une origine contrôlée.
Même si cela ne garantit pas que les données ne puissent être falsifiées, cela complique la tache du faussaire.
Si vous ne vous préoccupez pas de l'origine des données, vous pouvez utiliser la variable $_REQUEST qui contient un mélange de données GET, POST et COOKIE.

Détection simple de fausses variables.

<?php
if (isset($_COOKIE['MAGIC_COOKIE'])) {
// MAGIC_COOKIE provient d'un cookie.
// Assurez-vous de valider les données du cookie!
} elseif (isset($_GET['MAGIC_COOKIE']) || isset($_POST['MAGIC_COOKIE'])) {
mail("Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.", "Tentative possible d'attaque", $_SERVER['REMOTE_ADDR']);
echo "Alerte sécurité, l'admin a été prévenu.";
exit;
} else {
// MAGIC_COOKIE ne provient pas de REQUEST
}
?>

 

Désactiver les variables super-globales

Ajouter la ligne suivante dans votre fichier .htaccess

php_value register_globals OFF
// Si cela ne fonctionne pas, tester avec ce code
SetEnv REGISTER_GLOBALS 0

Si votre hébergeur ne vous permet pas cette possibilité vous pouvez tenter de modifier le fichier php.ini si vous y avez accès.

register_globals = 0

Désactiver l'option register_globals ne sécurise pas le code.
Pour chaque donnée reçu, il faut appliquer un maximum de validations : vérifier les données du visiteur et initialiser les variables.
Pour vérifier les variables non-initialisées, voir la fonction error_reporting() qui peut afficher les erreurs de niveau E_NOTICE.

Si vous utilisez PHP 5.4 ou supérieur, il est inutile de s’en préoccuper, elle est obsolète et c’est tant mieux pour la sécurité.
Certains hébergeurs mettent encore ce paramètre sur ON sur les serveurs mutualisés. Vérifiez cela avec votre hébergeur et CORRIGEZ SI NÉCESSAIRE.
Si un script exige que le paramètre PHP Register_Globals soit sur ON. Oubliez le ! Trouvez un autre script.

Comment l'indomptable recherche scientifique va-t-elle rester au service du mieux-être physique et mental de tous ? Deux maîtres mots : éducation et éthique, qu'il faut traduire en pratique.
[Etienne-Emile Baulieu]

Visionduweb - La Réponse Collaborative - 2002 / 2019

Condition d'utilisation du site Visionduweb

Vous êtes soumis au règlement suivant et à ce titre ni l'administrateur ni l'hébergeur ne pourraient ni ne seraient tenu pour responsable de vos actes.
Vous ne devez en aucun cas utiliser les informations présentes sur Visionduweb pour nuire à autrui ou à un système informatique.

La licence CC BY-NC-ND 4.0 est attribuée au contenu rédigé par Visionduweb sur les domaines suivants :
www.visionduweb.com www.visionduweb.eu www.visionduweb.fr www.visionduweb.info

Les profils utilisés par Visionduweb : Anonymous, Visionduweb, Zer00CooL

Le serveur et les services sont accessibles.
------------------------------------
------------

Chercher dans ce site

Menu de connexion