Passer de l’information entre les pages Web en PHP

Dans le monde du Web, par défaut, les variables d’une page Web sont perdues lorsque la page Web n’est plus affichée. Heureusement, quelques mécanismes permettent de contrer ce fait. Sans ces mécanismes, les informations entrées dans un formulaire Web ne seraient disponibles que pour cette même page Web. Un usager qui entre son code d'authentification sur une page devrait l'entrer à nouveau lorsqu'il change de page. Le Web n'aurait pas pu connaître la popularité qu'il a aujourd'hui sans eux.

Ces mécanismes vous seront expliqués dans les paragraphes suivants :

▼Publicité

Les cookies

Un cookie est un petit fichier enregistré par un site Web sur le poste client. Le site Web y entre les données dont il doit se rappeler d’une page à l’autre.

Limite : les utilisateurs peuvent désactiver les cookies sur leur navigateur, ce qui rendrait la récupération des informations impossible. Mais, de nos jours, il y a tellement de fonctionnalités qui reposent sur les cookies que les utilisateurs ont tout intérêt à les laisser actifs.

Attention : l'utilisation d'un cookie pour conserver les informations d'authentification peut créer un important trou de sécurité. En effet, un utilisateur malveillant pourrait utiliser un renifleur (en anglais : sniffer) pour s'emparer des informations échangées entre le client et le serveur. Grâce à ces informations, il pourrait recréer le cookie sur son poste de travail, ce qui lui permettrait de s'authentifier en utilisant l'identité volée.

La seule façon de se prémunir contre ce type d'attaque est d'implanter un certificat de sécurité SSL sur le serveur. En effet, lorsqu'un site est protégé par un certificat SSL (son URL débutera par https://), les informations qui y sont échangées ne pourront pas être reniflées car elles seront cryptées.

Créer un cookie

La fonction setcookie() permet de créer un cookie. On doit lui indiquer :

  • Le nom du cookie. C'est ce nom qui permettra plus tard de retrouver la valeur qu'il contient.
  • La valeur à stocker dans le cookie.
  • La date d'expiration du cookie. Généralement, on partira de la date actuelle en utilisant la fonction time() puis on lui ajoutera le délai désiré en secondes.
    • Pour que le cookie expire dès que le navigateur est fermé, entrer la valeur 0.
    • Pour que le cookie n'expire jamais, entrer 50 ans.

Ex :

PHP

setcookie('langue','fr', 0);   // cookie qui expire à la fermeture du navigateur

PHP

setcookie('langue','fr', time()+60*60*24*7);   // cookie qui expire dans 7 jours

PHP

setcookie('langue','fr', time()+60*60*24*365*50);    // cookie qui n'expire jamais

Attention : La fonction setcookie() doit être placé avant tout code HTML, car le cache du navigateur doit être vide pour que cette fonction fonctionne convenablement.

Retrouver les informations d'un cookie

Avant de tenter de retrouver l'information d'un cookie, il faut toujours s'assurer que le cookie existe. On retrouvera ensuite les informations à l'aide de la variable globale $_COOKIE.

Ex :

PHP

if(isset($_COOKIE['langue'])) {

   $langue = $_COOKIE['langue'];

}

Protection contre les utilisateurs malveillants

Comme le cookie est stocké sur le poste du client, il est possible pour un usager malveillant de modifier ces informations afin de créer une attaque sur le serveur.

Afin de nous prémunir contre de telles attaques, il faudra toujours prendre les précautions de base suivantes. Il s'agit des mêmes précautions que pour toute information qui pourrait avoir été modifiée par un usager.

  • Faire un addslashes() avant d'utiliser cette information dans une requête
  • Faire un htmlentities() avant de l'afficher à l'écran

Ex :

PHP

$requete = "SELECT page_texte_" . addslashes($langue) . " FROM page WHERE page_url = '$url'";

PHP

echo "Votre langue : " . htmlentities($langue);

Mise à jour

Pour en savoir plus sur la protection contre les attaques XSS et les injections SQL, consultez les articles suivants :

Modifier un cookie

Pour modifier un cookie, il suffit de créer un nouveau cookie qui porte le même nom. L'ancien cookie sera automatiquement écrasé.

Détruire un cookie

Les cookies sont gérés par les navigateurs et sont stockés sur le poste client. Il n'existe pas de fonction permettant de les détruire. La technique à utiliser consiste à changer la date d'expiration du cookie pour qu'elle soit dans le passé.

Ex :

PHP

setcookie('langue','fr', time()-10000);

Données d'un formulaire

Lorsqu'un usager entre des données entrées dans un formulaires, le site Web devra récupérer ces données pour pouvoir les traiter.

get vs post

Lorsque l'usager soumet un formulaire, les données entrées dans les champs du formulaire sont stockées dans une variable globale.

Si le formulaire utilise la méthode get, les données sont stockés dans le vecteur $_GET.

Avec la méthode post, les données sont stockées dans le vecteur $_POST.

Indices du vecteur

Les variables $_GET et $_POST étant des vecteurs, on pourra retrouver les données d'un champ en utilisant le nom du champ comme indice du vecteur.

Ex : si le formulaire est entré comme suit :

PHP

<form method="post" action="<?php echo $_SERVER['SCRIPT_NAME']; ?>">

   <p>

      <label class="aligne" for="usager">Usager :</label>

      <input class="boite" type="text" id="usager" name="usager" />

   </p>

   ...

   <p>

      <input class="aligne" type="submit" value="soumettre" name="soumettre" />

   </p>

</form>

La page qui traite les données entrées fera ceci :

PHP

if (isset($_POST['soumettre'])) {              // si la page a reçu des données du formulaire

   $usager = $_POST['usager'];

   ...

}

Les variables de session

Dans le monde du Web, une session est une période de temps qui débute généralement lorsqu'un internaute accède à un site Web et qui se termine :

  • soit lorsque l'internaute ferme son navigateur,
  • soit après une durée de temps déterminée et configurable.

En PHP, la notion de session permet de stocker des informations propres à un internaute. La session utilise un petit fichier texte (un cookie) placé sur le serveur. Le code PHP peut y enregistrer toutes les informations qui doivent être passées d’une page à l’autre.

Pour différencier les informations des différents utilisateurs du site Web, une identification de session doit être créée. L’ID de session doit être conservée dans un cookie côté client. Dans le cas où ce dernier aurait désactivé ses cookies, l’ID sera passée en paramètre grâce à l’encodage d’URL.

Les variables de session sont stockées dans un tableau nommé $_SESSION. Pour pouvoir utiliser ce tableau, chaque page doit démarrer la session.

Ex :

PHP

session_start();

Afin de nous prémunir contre d'éventuelles attaques, une précaution intéressante consiste à faire précéder le session_start() du caractère @. Ceci fera en sorte que si la fonction génère une erreur pour une raison quelconque, l'erreur ne sera pas affichée à l'écran. Ainsi, les utilisateurs malveillants seront privés d'information intéressante ouvrant des portes que nous préférons garder fermées...

Ex :

PHP

@session_start();

Attention : l'instruction session_start() doit être placée avant toute balise HTML envoyée au client sinon, elle ne sera pas prise en compte et la page Web ne pourra utiliser les variables de session.

Voici quelques exemples d'utilisation des variables de session.

Pour créer une variable de session et lui assigner une valeur :

PHP

$_SESSION['usager'] = $usager;

Pour vérifier si une variable de session existe :

PHP

if (isset($_SESSION['usager']))

Pour lire le contenu d'une variable de session :

PHP

$usager = $_SESSION['usager'];

Pour détruire une variable de session :

PHP

unset($_SESSION['usager']);

Pour détruire toutes les variables de session :

PHP

session_unset();

Exemple utilisant plusieurs des instructions précédentes :

PHP

@session_start();

...

if (!isset($_SESSION['code_usager'])) {

   echo "Votre session vient d'être ouverte";

   echo "<a href='authentif.php'>Cliquez ici pour vous authentifier</a>";

   $_SESSION['test'] = 'allo';

}

else {

   echo "Nous continuons avec la session existante : ".session_name()."=".session_id();

}

Modifier la durée de vie d'une variable de session

La durée de vie d'une session peut être configurée à différents endroits.

session.gc_maxlifetime

Dans le fichier .php.ini, la ligne session.gc_maxlifetime indique le nombre de secondes pendant lequel la session peut demeurer active après la dernière action de l'internaute (ex : après le dernier clic effectué). Par défaut, on retrouve :

PHP

session.gc_maxlifetime = 1440

Ceci signifie que la session demeurera toujours active, en autant que l'usager effectue au moins une action sur le site Web à toutes les 24 minutes.

Note : dans les faits, la durée de vie sera aussi influencée par les variables session.gc_probability et session.gc_divisor. À vous de lire sur ces variables, si vous voulez avoir un meilleur contrôle sur la durée de vie de vos sessions.

session.cookie_lifetime

Cette variable, aussi présente dans le fichier php.ini, fonctionne selon l'approche inverse. Elle indique le nombre de secondes après lequel la session sera réinitialisée, que l'internaute soit actif ou pas.

Par défaut, on retrouve :

PHP

session.cookie_lifetime = 0

Ceci signifie que la session ne sera pas détruite automatiquement tant que le navigateur sera ouvert. Donc, une fermeture du navigateur cause automatiquement la destruction de la session.

Si on avait mis :

PHP

session.cookie_lifetime = 3600

la durée maximale d'une session aurait été d'une heure. Après cette durée, une session serait automatiquement détruite, même si l'usager est toujours actif (même s'il a effectué un clic il y a 1 minute). Par contre, l'usager pourrait fermer son navigateur puis le réouvrir et, s'il retourne sur le site Web avant que le délai soit dépassé, sa session serait toujours vivante.

Modifier une configuration de php.ini par programmation

La fonction ini_set() permet de modifier une configuration de php.ini sans modifier ce fichier. La modification sera active seulement pour la durée du programme PHP.

Ex :

PHP

ini_set('session.gc_maxlifetime', 7200);

Attention : cette instruction doit être placée AVANT le session_start() pour qu'elle soit prise en compte.

Encodage d'URL, ou comment ajouter un paramètre dans un URL

Prenons le cas où un site Web affiche une liste de nouvelles. Un clic sur une nouvelle doit mener vers une page affichant la nouvelle complète. Donc, une même page Web, disons nouvelle.php, affichera l'une ou l'autre des nouvelles selon l'endroit où l'usager aura cliqué dans la liste.

Comment alors la page Web saura-t-elle quelle nouvelle afficher ? Une technique intéressante consistera à ajouter l'identifiant de la nouvelle comme paramètre dans l'URL. Par exemple, l'URL nouvelle.php?id=6 permettra d'afficher la nouvelle no 6.

Pour passer un paramètre dans l'URL, il suffit de faire suivre le nom de la page Web par un point d'interrogation. Suivront ensuite une ou plusieurs paires variable=valeur, séparées par un esperluette (&).

Limite : la taille maximale de l’URL est de 255 caractères.

Ex : http://monsiteweb.com/nouvelle.php?id=6

Ex : http:/monsiteweb.com/fiche.php?form_id=4&mod_id=794&fiche_id=1222

Encodage de l'URL

Dans la plupart des cas, les URL avec paramètres seront encodés dans un lien.

Ex :

PHP

echo "<a href='http://monsiteweb.com/fiche.php?form_id=4&mod_id=794&fiche_id=1222'>Théorie sur l'encodage d'URL</a>";

Mieux : on utilisera des variables pour préciser les paramètres.

Ex :

PHP

echo "<a href='http://monsiteweb.com/fiche.php?form_id=$formation&mod_id=$module&fiche_id=$fiche'>$titre</a>";

Décodage de l'URL

Dans la page visée par ce lien (ex : dans la page fiche.php), on pourra retrouver la valeur d'un paramètre en utilisant $_GET. Il faut toujours utililser isset() pour vérifier si le paramètre existe avant de tenter de lire sa valeur.

Ex :

PHP

if (isset($_GET['form_id'])) {

   $formation = $_GET['form_id'];

   ...

}

else {

   ...

}

Dans cet exemple, si un internaute tentait d'accéder à la page en entrant directement son URL sans préciser de paramètres (ex : en tapant « http://monsiteweb.com/fiche.php » dans la barre d'URL de son navigateur), le code du else serait exécuté puisqu'aucune formation n'aurait été précisée. Le programme pourrait, par exemple, rediriger l'internaute à une page sur laquelle on peut choisir la formation désirée.

Protection contre les utilisateurs malveillants

Ici encore, il faut protéger notre code avant d'utiliser une variable dont la valeur a été entrée par un utilisateur. En effet, un utilisateur malveillant pourrait tenter une attaque en entrant différents caractères dans un paramètre dans l'URL.

Afin de nous prémunir contre de telles attaques, il faudra faire appel à addslashes() avant d’utiliser cette information dans une requête et faire un htmlentities() avant de l’afficher à l’écran. Il s'agit de précautions de base auxquelles on pourra ajouter d'autres protections permettant de blinder notre code.

Ex :

PHP

$requete = “SELECT form_titre FROM formation WHERE form_id = '" . addslashes($formation) . "'";

PHP

echo “Identifiant de la formation : ” . htmlentities($form_id);

Mise à jour

Pour en savoir plus sur la protection contre les attaques XSS et les injections SQL, consultez les articles suivants :

Pour plus d'information

« Les cookies ». Apprendre PHP. http://www.apprendre-php.com/tutoriels/tutoriel-13-les-cookies.html

« Les cookies et PHP ». PHP  codeur. http://phpcodeur.net/articles/php/cookies

« Sniffers: What They Are and How to Protect Yourself ». Synantec. http://www.symantec.com/connect/articles/sniffers-what-they-are-and-how-protect-yourself

« Gestion des sessions ». PHP.net. http://ca2.php.net/manual/fr/book.session.php

« PHP - Utilisation des sessions ». PHP sources. http://www.phpsources.org/tutoriel-sessions.htm

« Petite FAQ sur les Sessions PHP ». Developpez.com. http://cyberzoide.developpez.com/php4/faqsession/

« PHP : cookies et sessions - Comprendre l'expiration des sessions ». Les cigales. http://julp.lescigales.org/php/sessions/#expiration

« PHP et les sessions : durée de vie, utilisation avancée et quelques subtilités ». Journal du net. http://www.journaldunet.com/developpeur/php/php-et-les-sessions/

« PHP et les sessions : utilisation avancée ». Journal du net. http://www.journaldunet.com/developpeur/php/php-et-les-sessions-2/

« Tutoriel PHP - PHP - POST & GET ». PHP Sources. http://www.phpsources.org/tutoriel-get-post.htm

« PHP - Récupération de données ». Comment ça marche. http://www.commentcamarche.net/contents/php/phpform.php3

Merci de partager ! Share on FacebookTweet about this on TwitterShare on Google+Share on LinkedInPin on PinterestShare on StumbleUponEmail this to someone
Catégories

2 commentaires

  1. fireboe

    Bonjour Christiane,
    Je suis tombé sur ton site car je cherchais des informations sur les cookies de session.

    J’aimerai juste apporté ma contribution concernant les 2 points ci-dessous:
    – Protection contre les utilisateurs malveillants: addslash est n’est pas suffisant pour les attaques de type injection sql, si c’est du mysql : il faut utiliser mysql_real_escape_string($variable) entourée de quotes simples si la variable est une chaine de caractere et intval($variable) si celle ci est numérique.
    – En ce qui concerne les attaques de type xss, il faut utiliser htmlentities($var,ENT_QUOTES) car elle permet d’encoder aussi les quotes simples et doubles.
    – pour l’encodage url: il faut utiliser urlencode()

    Dans tout les cas ne pas faire confiance aux paramètres utilisateur ($_GET / $_POST/ $_COOKIE/ …)

    fire

    • Christiane Lagacé

      Merci pour ces précisions. J’ai ajouté une note pour référer les lecteurs à d’autres articles plus précis sur les attaques.

      Christiane