Utilisation des variables super-globales

Avertissement

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("admin@example.com""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