Alain Barraud Mémento informatique  
 
Accueil Logithèque - SE Photo - vidéo Internet - protocoles Site Web PC - Réseau Archives
Page ouverte le 01/03/2010
retour sommaire PHP
Logo PHP
Partie 2 : TP : page protégé par mot de passe

On va passer au concret et réaliser un premier script PHP.
On a déjà vu tout ce qu'il fallait pour pouvoir protéger le contenu d'une page par mot de passe et c'est ce qu'on va voir ici.
Sommaire

Instructions pour réaliser le TP

Les prérequis
Voici ce dont on va avoir besoin et que l'on a vu :
  • Afficher le texte avec echo
  • Utiliser les variables (affectation, affichage…)
  • Transmettre des variables via une zone de texte d'un formulaire
  • Utiliser des conditions simples (if, else)
L'objectif
Mettre en ligne une page web pour donner des informations confidentielles à certaines personnes. Cependant, pour limiter l'accès à cette page, il faudra connaître un mot de passe.

Pour le TP, les données confidentielles seront les codes d'accès au seveur central de la NASA. Le mot de passe pour pouvoir visualiser les codes d'accès sera kangourou
comment réaliser une page qui n'affiche ces codes d'accès que si on a rentré le bon mot de passe ?
Comment procéder ?
Dabord, un peu de méthode, travailler sur un brouillon.
question A quoi doit-on réfléchir sur notre brouillon ?
  1. Au problème posé (que veut-on faire ?)
  2. Au shéma du code (on le découpe en morceaux).
  3. Aux fonctions et connaissances PHP dont on va avoir besoin.
Problème posé
Protéger l'accès à une page par un mot de passe. La page ne doit pas s'afficher si on n'a pas le mot de passe.
Shéma du code
Pour que l'utilisateur puisse rentrer un mot de passe, le plus simple est de créer un formulaire. Celui-ci appellera la page protégée et lui enverra le mot de passe.
L'accès au contenu de la page ne sera autorisé que si le mot de passe est kangourou

accès protégé


On doit donc créer 2 pages web :
  • formulaire.php, contient un simple formulaire
  • secret.php, contient les "codes secrets" mais ne les affiche que si on lui donne le mot de passe.
Connaissances requises
On l' avu au départ dans les prérequis

Correction

La page formulaire.php
Code PHP
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
    <head>
        <title>Page protégée par mot de passe</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    </head>
    <body>
        <p>Veuillez entrer le mot de passe pour obtenir les codes d'accès au serveur central de la NASA :</p>
        <form action="secret.php" method="post">
            <p>
            <input type="password" name="mot_de_passe" />
            <input type="submit" value="Valider" />
            </p>
        </form>
        <p>Cette page est réservée au personnel de la NASA. Si vous ne travaillez pas à la NASA, inutile d'insister vous ne trouverez jamais le mot de passe ! ;-)</p>
    </body>
</html>
On a pris un champ de type "password" car il s'agit d'un mot de passe.

La page secret.php qui sera appelée par le formulaire :
Code PHP
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
    <head>
        <title>Codes d'accès au serveur central de la NASA</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    </head>
    <body>

    <?php
    if (isset($_POST['mot_de_passe']) AND $_POST['mot_de_passe'] == "kangourou") // Si le mot de passe est bon
    {
    // On affiche les codes
    ?>
        <h1>Voici les codes d'accès :</h1>
        <p><strong>CRD5-GTFT-CK65-JOPM-V29N-24G1-HH28-LLFV</strong></p>

        <p>
        Cette page est réservée au personnel de la NASA. N'oubliez pas de la visiter régulièrement car les codes d'accès sont changés toutes les semaines.<br />
        La NASA vous remercie de votre visite.
        </p>
    <?php
    }
    else // sinon, on affiche un message d'erreur
    {
        echo '<p>Mot de passe incorrect</p>';
    }
    ?>


    </body>
</html>
Dans la page secrète, on vérifie d'abord si on a envoyé un mot de passe (avec isset) et si ce mot de passe est bien celui qu'on attend (kangourou).
Si ces deux conditions sont remplies, on peut afficher les codes d'accès.
alt Comme on le voit, on n'a pas fait un echo pour afficher tout le texte. Quand il y a beaucoup de texte à afficher, il est préférable de fermer les balises PHP après l'accolade du if, c'est plus simple et plus lisible.
En revanche, dans le cas du else comme il n'y a qu'une petite phrase à afficher, on a choisi de l'afficher avec un echo.

question Cette protection est-elle efficace ?
Oui, à condition de ne pas avoir un mot de passe comme "kangourou" mais de prendre un mot de passe digne de ce nom. Il doit être long avec majuscules, minuscules, chiffres et qui a peu de chance d'être trouvé par hasard. Exemple : f2tyzP3ZDgt4

Aller plus loin

Si on veut, il est possible de réaliser ce TP en une seule page au lieu de deux.
Il faut pour cela que le formulaire, sur la page formulaire.php, s'appelle lui-même. Autrement dit, l'attribut action du formulaire serait action="formulaire.php". Cela voudrait dire que les données seraient renvoyées sur la même page :

formulaire s'appelant
Dans ce mode de fonctionnement, la page formulaire.php contiendrait à la fois le formulaire et le message secret.
question Comment peut-on faire ? Est-ce sécurisé ?
Cela peut être fait de façon sécurisé, c'est juste un peu plus difficile à imaginer.
Il faut construire le code de la page formulaire.php en 2 grandes parties :
  • Si aucun mot de passe n'a été envoyé (ou s'il est faux) : afficher le formulaire
  • Si le mot de passe a été envoyé et qu'il est bon : afficher les codes secrets

Toute la page PHP sera donc architecturée autour d'un grand if qui porrait ressembler à quelque chose comme ça :
Code PHP
<?php

// le mot de passe n'a pas été envoyé ou n'est pas bon
if (isset($_POST['mot_de_passe']) OR $_POST['mot_de_passe'] != "kangourou")
{
    // Afficher le formulaire de saisie du mot de passe
}
// le mot de passe a été envoyé et il est bon
else
{
    // Afficher les codes secrets
}

?>
Ce sont les grandes lignes de comment on fait. A chaque fois que la page formulaire.php est appelée, elle détermine (grâce au if) si on l'appelle pour afficher la partie secrète ou si on l'appelle pour afficher le formulaire de saisie du mot de passe.

Ce qui se passera alors :
  1. La première fois que le visiteur charge la page formulaire.php, aucune donnée POST n'est envoyée à la page. C'est donc le formulaire qui s'affiche.
  2. Une fois qu'on a envoyé le formulaire, la page formulaire.php est rechargée et cette fois elle reçoit les données POST qu'on vient d'envoyer. Elle peut donc les analyser et, si le mot de passe est bon, elle affiche les codes secrets.
alt On pourrait même aller plus loin, car on n'a pas prévu le cas pour afficher "Mot de passe incorrect".
Cela peut se faire facilement en découpant la page en 3 à l'aide d'un elseif : formulaire, mot de passe incorrect, codes secrets.