Cours 9 : conserver des informations

Le problème

On veut pouvoir conserver des informations d’une page sur l’autre, comme l’identifiant de l’utilisateur connecté (pour ne pas avoir à se reconnecter à chaque page), tout en empêchant autant que possible l’usurpation d’identité.

Dans les exemples présentés ici, on se limitera à transmettre le contenu d’une variable, nommée $test, d’une exécution à l’autre d’un même script, en précisant quand et comment un utilisateur a la possibilité de modifier cette valeur.

La variable

Une variable n’est conservée que pendant l’exécution courante d’un script. Si on charge un autre script, ou même si on recharge le script courant, le contenu des variables est perdu :

<?php
  if(! isSet($test))
     $test = "toto";
?>
<!DOCTYPE html>

<html dir="ltr" xml:lang="fr-FR" lang="fr-FR">

  <head>
    <meta charset="utf8" />
    <title>Test variable</title>
    <meta name="author" content="Christophe Prieur" />
  </head>

  <body>

    <?php
      echo "<p>$test</p>";
      $test = "tutu";
      echo "<p>$test</p>";
    ?>
    <p>Rechargez la page pour voir si la valeur de la variable est conservée</p>
  </body>

</html>

Résultat ici.

GET

On peut alors transmettre le contenu d’une variable comme paramètre du script :

<?php
   if(isSet($_GET["test"]))
     $test = htmlentities($_GET["test"]);
   else
     $test = "toto";
?>
<!DOCTYPE html>

<html dir="ltr" xml:lang="fr-FR" lang="fr-FR">

  <head>
    <meta charset="utf8" />
    <title>Test get</title>
    <meta name="author" content="Christophe Prieur" />
  </head>

  <body>

    <?php
       echo "<p>$test</p>";
       $test = "tutu";
       echo "<p>$test</p>";
     ?>
    <p>
      <?php
        echo "<a href=\"?test=$test\">";
     echo "Recharger en conservant la valeur</a>.";
       ?>
    </p>
  </body>

</html>

Résultat ici.

La méthode get est faite pour que l’utilisateur puisse changer facilement le paramètre (comme dans le cas d’une requête à un moteur de recherche par exemple), en le tapant directement dans la barre d’adresse. Par conséquent,
on a utilisé ici htmlentities pour « neutraliser » les éventuels caractères spéciaux qui permettraient à l’utilisateur d’envoyer du code html, d’autant qu’on affiche la valeur transmise.

Exemple de tentative d’affichage d’une image :

?test=<img src="http://...image.jpg">

qui se solde par un échec, grâce à htmlentities :

le source transmis est affiché tel quelget-img-echec.png

Si on veut empêcher l’utilisateur de fixer lui-même la valeur de la variable, on doit utiliser une autre méthode.

POST

Avec la méthode post, le paramètre ne passe pas par l’url :

<?php
   if(isSet($_POST["test"]))
     $test = htmlentities($_POST["test"]);
   else
     $test = "toto";
?>
<!DOCTYPE html>

<html dir="ltr" xml:lang="fr-FR" lang="fr-FR">

  <head>
    <meta charset="utf8" />
    <title>Test get</title>
    <meta name="author" content="Christophe Prieur" />
  </head>

  <body>

    <?php
       echo "<p>$test</p>";
       $test = "tutu";
       echo "<p>$test</p>";
     ?>
    <p>
      <form action="" method="post">
      <?php
        echo '<input type="hidden" name="test" value="'
             . $test . '" />';
       ?>
       <input type="submit" value="Recharger en conservant la valeur" />
       </form>
    </p>
  </body>

</html>

Résultat ici.

La modification de la variable n’est donc plus à la portée de n’importe quel utilisateur comme c’est le cas avec get, mais elle reste néanmoins triviale pour un développeur web, puisqu’il suffit de répliquer le formulaire dans n’importe quel script php en indiquant l’adresse du script ci-dessus :

<html dir="ltr" xml:lang="fr-FR" lang="fr-FR">

  <head>
  <meta charset="utf8" />
  <title>Test post</title>
  <meta name="author" content="Christophe Prieur" />
  </head>

  <body>
    <p>
      <form action="param-post.php" method="post">
    <input type="hidden" name="test" value="je suis un tricheur">
    <input type="submit" value="Charger avec ma valeur" />
      </form>
    </p>
  </body>

</html>

Résultat ici.

Cette méthode permet donc de transmette des paramètres dont on ne souhaite pas que le contenu ou le nom soient immédiatement visibles, mais ici encore,
si on veut empêcher l’utilisateur de fixer lui-même la valeur de la variable, on doit utiliser une autre méthode.

Les cookies

Les cookies sont des informations stockées sur le client (donc le navigateur) à la demande du serveur.

Pour placer un cookie sur le client, on utilise la fonction setcookie :

  • setcookie(paramètre, valeur)
  • setcookie(paramètre, valeur, time() + s), pour fixer une durée de vie s en secondes.

Attention La fonction setcookie doit être appelée avant tout affichage, sinon elle se solde par un échec. En particulier, il ne doit y avoir aucun caractère (même un espace ou un saut de ligne) entre le début du fichier et la balise php.

On récupère les valeurs des paramètres au moyen de $_COOKIE[paramètre] ou de $_REQUEST[paramètre] (ce dernier permet également de récupérer un paramètre transmis par get ou post). Ces variables ne peuvent être utilisées qu’un lecture (pour modifier la valeur de $_COOKIE, il faut utiliser la fonction setcookie).

<?php
   if(isSet($_COOKIE["test"]))
     $test = htmlentities($_COOKIE["test"]);
   else
     $test = "toto";

   $newtest = "tutu";
   $res = setcookie("test", $newtest, time() + 300);
?>
<!DOCTYPE html>

<html dir="ltr" lang="fr-FR">

  <head>
  <meta charset="utf8" />
  <title>Test cookie</title>
  <meta name="author" content="Christophe Prieur" />
  </head>

  <body>

  <?php
     echo "<p>$test</p>";
     $test = $newtest;
     echo "<p>$test</p>";
   ?>
  <p>
    <?php
       if($res)
         echo "Le cookie a bien été envoyé, rechargez la page pour tester.";
       else
         echo "Le cookie n'a pas pu être envoyé, laissez-moi tranquille !";
     ?>
  </p>
  </body>

</html>

Résultat ici. La durée de vie du cookie a été mise à 5 minutes (300 secondes) pour permettre des tests.

Les cookies sont utilisés notamment pour stocker des informations sur la navigation de l’utilisateur (préférences) sans qu’il soit identifié. Comme ils sont stockés par le navigateur, sur le disque de l’utilisateur, il lui est toujours possible d’y accéder, de les afficher, voire de les modifier (au moyen d’extensions Firefox, Chrome ou Opera).

Par conséquent, ici encore, si on veut vraiment empêcher l’utilisateur de fixer lui-même la valeur de la variable, on doit utiliser une autre méthode.

Les sessions

C’est un mécanisme de php pour stocker des informations sur le serveur entre deux visites d’un même utilisateur en limitant l’information transmise par le client à une seule valeur, l’identifiant de session, générée au moyen d’un procédé cryptographique qui rend extrêmement difficile sa falsification.

L’identifiant de session est transmis sans même que le programmeur n’ait à s’en soucier, au moyen d’un cookie, ou de la méthode get si le navigateur est configuré pour ne pas accepter les cookies.

Pour démarrer une session ou reprendre une session existante, on utilise la fonction session_start (sans paramètres), qui renvoie un booléen indiquant si l’opération a réussi.

On fixe ensuite les valeurs des paramètres que l’on souhaite au moyen de $_SESSION[paramètre], qui peut être utilisé en lecture comme en écriture (contrairement à $_COOKIE, $_REQUEST, $_GET et $_POST, qui ne s’utilisent qu’en lecture).

Attention Comme pour setcookie, la fonction session_start doit être appelée avant tout affichage, sinon elle se solde par un échec. En particulier, il ne doit y avoir aucun caractère (même un espace ou un saut de ligne) entre le début du fichier et la balise php.

<?php
   $res = session_start();
   if(isSet($_SESSION["test"]))
     $test = htmlentities($_SESSION["test"]);
   else
     $test = "toto";

   $newtest = "tutu";
?>
<!DOCTYPE html>

<html dir="ltr" lang="fr-FR">

  <head>
  <meta charset="utf8" />
  <title>Test session</title>
  <meta name="author" content="Christophe Prieur" />
  </head>

  <body>

  <?php
     echo "<p>$test</p>";
     $_SESSION["test"] = $test = $newtest;
     echo "<p>$test</p>";
   ?>
  <p>
    <?php
       if($res)
         echo "La session a bien été créée, rechargez la page pour tester.";
       else
         echo "La session n'a pas pu être créée, laissez-moi tranquille !";
     ?>
  </p>
  </body>

</html>

Résultat ici.

Pour fermer la session, on utilise session_destroy (sans paramètres),
qui renvoie un booléen indiquant si l’opération a réussi.

Pour plus de détails sur les sessions php, consulter la documentation php sur la gestion des sessions

Cette entrée a été publiée dans Cours, avec comme mot(s)-clef(s) , , , , . Vous pouvez la mettre en favoris avec ce permalien.

12 réponses à Cours 9 : conserver des informations

  1. Heather dit :

    Hello there

    Looking to improve your posture and live a healthier life? Our Medico Postura™ Body Posture Corrector is here to help!

    Experience instant posture improvement with Medico Postura™. This easy-to-use device can be worn anywhere, anytime – at home, work, or even while you sleep.

    Made from lightweight, breathable fabric, it ensures comfort all day long.

    Grab it today at a fantastic 60% OFF: https://medicopostura.com

    Plus, enjoy FREE shipping for today only!

    Don’t miss out on this amazing deal. Get yours now and start transforming your posture!

    Kind Regards,

    Heather

  2. Carri dit :

    PawSafer™ Can Safely Trim Your Dog’S Nails In No Time From Home.

    Get it while it’s still 50% OFF + FREE Shipping

    Buy here: https://pawsafer.sale

    Best Wishes,

    Carri

  3. Silas dit :

    New Multifunction Waterproof Backpack

    The best ever SUPER Backpack: Drop-proof/Scratch-resistant/USB Charging/Large capacity storage

    50% OFF for the next 24 Hours ONLY + FREE Worldwide Shipping for a LIMITED time

    Buy now: https://thebackpack.co

    Thank You,

    Silas

  4. Brianna dit :

    Good Morning

    The New Powerful LED Flashlight is The Perfect Flashlight For Any Situation!

    The 3,000 Lumens & Adjustable Zoom gives you the wide field of view and brightness other flashlights don’t have.

    50% OFF + Free Shipping! Get it Now: https://linterna.cc

    The Best,

    Brianna

  5. Juliana dit :

    World’s Best Neck Massager Get it Now 50% OFF + Free Shipping!

    Wellness Enthusiasts! There has never been a better time to take care of your neck pain!
    Our clinical-grade TENS technology will ensure you have neck relief in as little as 20 minutes.

    Get Yours: https://hineck.co

    Best regards,

    Juliana
    Cours 9 : conserver des informations | didiode

  6. Jacquelyn dit :

    Hi

    Looking to improve your posture and live a healthier life? Our Medico Postura™ Body Posture Corrector is here to help!

    Experience instant posture improvement with Medico Postura™. This easy-to-use device can be worn anywhere, anytime – at home, work, or even while you sleep.

    Made from lightweight, breathable fabric, it ensures comfort all day long.

    Grab it today at a fantastic 60% OFF: https://medicopostura.com

    Plus, enjoy FREE shipping for today only!

    Don’t miss out on this amazing deal. Get yours now and start transforming your posture!

    Thanks and Best Regards,

    Jacquelyn

  7. Ola dit :

    Hi,

    If you are one of the sufferers of the common problems nails have, then you are in luck! Our Toenail Clippers is here to help. It has a specially designed clip that can help those with troubles with winding nails, hard nails, two nails, nail cracks, deep nails, and thickened nails.

    We are confident that our Toenail Clippers will provide you with the results you are looking for.

    Get yours today with 60% OFF: https://podiatristusa.sale

    Many Thanks,

    Ola

  8. Esther dit :

    Hi there

    I wanted to reach out and let you know about our new dog harness. It’s really easy to put on and take off – in just 2 seconds – and it’s personalized for each dog.
    Plus, we offer a lifetime warranty so you can be sure your pet is always safe and stylish.

    We’ve had a lot of success with it so far and I think your dog would love it.

    Get yours today with 50% OFF: https://caredogbest.com

    FREE Shipping – TODAY ONLY!

    Regards,

    Esther

  9. Lourdes dit :

    Good day

    Defrost frozen foods in minutes safely and naturally with our THAW KING™.

    50% OFF for the next 24 Hours ONLY + FREE Worldwide Shipping for a LIMITED

    Buy now: https://thawking.co

    The Best,

    Lourdes

  10. Magda dit :

    New Multifunction Waterproof Backpack

    The best ever SUPER Backpack: Drop-proof/Scratch-resistant/USB Charging/Large capacity storage

    50% OFF for the next 24 Hours ONLY + FREE Worldwide Shipping for a LIMITED time

    Buy now: https://thebackpack.co

    To your success,

    Magda

  11. Enriqueta dit :

    Morning,

    I hope this email finds you well. I wanted to let you know about our new BANGE backpacks and sling bags that just released.

    The bags are waterproof and anti-theft, and have a built-in USB cable that can recharge your phone while you’re on the go.

    Both bags are made of durable and high-quality materials, and are perfect for everyday use or travel.

    Order yours now at 50% OFF with FREE Shipping: http://bangeshop.com

    Best regards,

    Enriqueta

  12. Linnea dit :

    Hey there

    I wanted to reach out and let you know about our new dog harness. It’s really easy to put on and take off – in just 2 seconds – and it’s personalized for each dog.
    Plus, we offer a lifetime warranty so you can be sure your pet is always safe and stylish.

    We’ve had a lot of success with it so far and I think your dog would love it.

    Get yours today with 50% OFF: https://caredogbest.com

    FREE Shipping – TODAY ONLY!

    The Best,

    Linnea

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Merci de répondre à cette question pour prouver que vous n'êtes pas un robot :

Combien font 3 fois 5 ?