Utilisation des variables super-globales
Cette fonctionnalit� est OBSOLETE depuis PHP 5.3.0 et a �t� SUPPRIMEE depuis PHP 6.0.0. Nous vous encourageons vivement � ne plus l'utiliser.
L'une des �volutions les plus controvers�es de PHP a �t� le changement de valeur par d�faut de la directive PHP register_globals, qui est pass�e de On � Off en PHP » 4.2.0. Beaucoup d'applications d�pendaient de cette directive, et de nombreux programmeurs ne savaient m�me pas qu'elle existait, et supposait que c'�tait le fonctionnement normal de PHP. Cette page explique comment on peut �crire du code peu s�curitaire en utilisant cette directive. Gardez bien en t�te que cette directive, par elle-m�me, n'est pas un trou de s�curit�, mais qu'elle facilite leur cr�ation.
Lorsqu'elle est activ�e, register_globals va injecter vos scripts avec toutes sortes de variables, comme les variables issues des formulaires HTML. Ceci, coupl� au fait que PHP ne requiert pas d'initialisation de variable signifie que la programmation de script peu s�r est possible. Ce fut une d�cision difficile de la communaut� PHP, mais finalement, il a �t� d�cid� de d�sactiver par d�faut cette variable. Lorsqu'elle est active, le programmeur ne sait pas exactement d'o� provient le contenu de la variable, et ne peut que faire des suppositions. Les variables internes d�finies dans le script sont m�lang�es avec les donn�es envoy�es par les utilisateurs, et en d�sactivant register_globals, on emp�che cela. Voyons avec un exemple le fonctionnement de register_globals :
Exemple #1 Exemple de mauvaise utilisation de register_globals
<?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 maintenant s�r, m�me s'il reste recommand� de toujours initialiser ses variables. Par exemple, dans notre programme ci-dessus, nous pourrions ajouter $authorized = false. En faisant cela, le script peut fonctionner avec register_globals on ou off, car les utilisateurs seront par d�faut non-identifi�s.
Un autre exemple implique les sessions. Lorsque register_globals est activ�, on peut aussi utiliser $username dans notre exemple, mais, encore une fois, vous devez garder en t�te que $username peut aussi provenir d'autres biais, tels que GET (via l'URL).
Exemple #2 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 m�me 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. Voyez aussi la section du manuel concernant les variables de sources externes � PHP.
Exemple #3 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("[email protected]", "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
}
?>
Bien sur, d�sactiver l'option register_globals ne signifie pas que votre code est s�curitaire. Pour chaque donn�e re�u, vous devez appliquer un maximum de validations. V�rifiez toujours les donn�es de votre visiteur, et initialisez vos variables! Pour v�rifier les variables non-initialis�es, voyez la fonction error_reporting(), qui peut afficher les erreurs de niveau E_NOTICE.
Pour des informations sur l'�mulation de register_globals On ou Off, voyez la FAQ.
Note: Superglobales : disponibilit�
Depuis PHP 4.1.0, les tableaux superglobaux tels que $_GET, $_POST et $_SERVER, etc. sont disponibles. Pour plus d'informations, lisez la section superglobals