Vous êtes sur la page 1sur 6

Master « Visualisation et Conception Infographiques en ligne » (VCIEL) Enseignant :

Mardi 22 mai 2007 Serge Miguet


Université Lumière Lyon 2

EP 32 : PHP / MySQL
Durée : 1h30
Documents manuscrits ou issus de la plate-forme Spiral autorisés

Le but de cet exercice est de réaliser


un système d’authentification des
utilisateurs d’un site web, basé sur
les outils étudiés dans le cours, et
facilitant la tâche du concepteur du
site protégé. Le fonctionnement
souhaité est symbolisé dans la figure
1 ci-contre.

Le site à protéger est composé de n


Figure 1 : Authentification des
pages web notées page 1, page 2, …
utilisateurs par identifiant / mot de passe
page n dans la figure. En principe,
on accède à la page 1 par un formulaire d’identification « id.html » (en haut dans la figure)
et dont l’aspect dans le navigateur est donné en figure 2 :

1. Donnez le code HTML de ce


formulaire, et justifiez la
méthode employée pour
transmettre les données du
formulaire au script de la page 1.
Figure 2 : Formulaire d’identification
« id.html »

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Accès au site protégé</title>
</head>
<body>
<h1> Accès au site protégé </h1>
<form method="POST" action="page1.php">
Identifiant : <input type="text" name="id"/><br />
Mot de passe : <input type="password" name="pass"/><br />
<input type="submit" value="OK"/>
</form>
</body>
</html>

Avec un GET, les données apparaissent "en clair" sur l'URL, Avec un POST, en effet, on ne voit pas les
données dans la barre d'adresse du navigateur

VCIel PHP / MySQL, mai 2007 page 1/6


Chacune des pages à protéger est un fichier PHP séparé. Pour éviter d’avoir à répéter dans
chaque fichier les tests d’authentification, ceux-ci sont regroupés dans le script
d’authentification « auth.php » (au bas de la figure 1), et inclus dans chaque page. Le code
de chacune des pages protégées a donc la structure donnée figure 3 :

2. Justifiez la nécessité d’inclure les tests


d’authentification dans chacune des n pages à
protéger, alors que le formulaire dirige l’internaute
sur la page 1 uniquement.

Le reste de l’exercice consiste maintenant à mettre au point le


Figure 3 : code PHP
script d’authentification « auth.php ».
d’une page protégée

3. Quelle est l’instruction PHP qu’il faut utiliser pour démarrer une session ? rappelez
le principe de fonctionnement des sessions.

2- sans inclure, l'utilisateur peut accéder à n'importe quelle page, On va donc mémoriser dans une
session PHP, l'identifiant et le mot de passe de l'utilisateur
3- Session_start()
Lors du premier appel à session_start(), le serveur crée un cookie de session, et le poste vers le
navigateur.
Les variables de session sont enregistrées sur le serveur, dans un fichier qui porte le nom de la variable
de session.
Lors des accès suivants, le client renvoie la valeur du cookie de session vers le serveur. Les appels à
session_start() vont alors restaurer la valeur de la variable $_SESSION, à partir du fichier stocké sur le
serveur

4. Donnez les instructions qui permettent de définir les variables PHP $id et
$passe correspondant au contenu que l’utilisateur a saisi dans le formulaire
d’identification (on prendra soin de vérifier que l’utilisateur est passé par un
formulaire pour arriver sur la page courante).

On va écrire le fichier "auth.php", qui va traiter les données du formulaire


<?php
if ( isset($_POST["id"] )) {
$id = $_POST["id"];
$passe = $_POST["pass"];
echo "Vous avez entré le login $id et le mot de passe $passe <BR />\n";
}
?>

5. Donnez les instructions permettant de mémoriser ces deux variables dans la


session courante.
<?php
session_start(); // Cet appel crée la session la première fois qu'il est appelé.
if ( isset($_POST["id"] )) {
$id = $_POST["id"];
$passe = $_POST["pass"];
echo "Vous avez entré le login $id et le mot de passe $passe <BR />\n";
$_SESSION["id"] = $id
$_SESSION["passe"] = $passe;
}
?>

VCIel PHP / MySQL, mai 2007 page 2/6


On suppose désormais que $_SESSION[“id”] et $_SESSION[“passe”] désignent
respectivement l’identifiant et le mot de passe de l’utilisateur. Ces variables peuvent avoir été
définies par les valeurs du formulaire (question 5), ou restaurées à partir de la session
courante (question 3).

On suppose dans un premier temps qu’il y a un unique couple valide identifiant / mot de
passe, partagé entre tous les utilisateurs du site, qui est mémorisé de manière permanente
(« en dur ») dans le script « auth.php ».

6. Donnez la portion de code permettant de rediriger l’utilisateur vers la page


« id.html » si le couple identifiant / mot de passe n’est pas correct.
if ( !( $_SESSION["id"] == "vciel" && $_SESSION["passe"] == "VCIEL" ) ) {
header("Location: id.html");
}

Fichier « auth.php »
<?php
session_start(); // démarrage de la session
if (isset($_POST["id"]) && isset($_POST["pass"])) { // si on vient du formulaire
$id = $_POST["id"]; // on récupère l'identifiant saisi dans le formulaire
$_SESSION["id"] = $id; // on mémorise cet identifiant dans la session
$pass = $_POST["pass"]; // pareil pour le mot de passe
$_SESSION["pass"] = $pass; // on mémorise ce mot de passe dans la session
} elseif (isset($_SESSION["id"]) && isset($_SESSION["pass"])){ // sinon, peut-être que la session a
déjà été ouverte
// (on vient d'une page où on était identifié)
$id = $_SESSION["id"]; // on restaure $id à partir de la session
$pass = $_SESSION["pass"]; // on restaure $pass à partir de la session
} else {
$id = ""; // sinon : on initialise id et pass avec des valeurs bidon
$pass = "";
}
if (! (($id == "vciel") && ($pass == "VCIEL")))
header("Location: id.html"); // redirection sur la page d'identification
?>

Fichier « page1.php »
<?php
include "auth.php";
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Page 1</title>
</head>
<body>
<H1> Page 1 </H1>
Ceci est la première page du site.
Cliquez <a href="page2.php">ici</a> pour aller à la page 2.<BR />
Cliquez <a href="close.php">là</a> pour fermer la session
</body>
</html>

VCIel PHP / MySQL, mai 2007 page 3/6


On souhaite dans un deuxième temps être capable de mémoriser dans la table nommée
« logins » d’une base de données MySQL nommée « acces », un ensemble de couples
identifiants / mots de passe, pour gérer plusieurs utilisateurs indépendants. L’identifiant (8
caractères maximum) pourra être la clef primaire de la table. Le mot de passe (8 caractères
maximum) sera stocké « en clair » dans la table (et non pas de manière cryptée). Pour chaque
identifiant, on souhaite également mémoriser le nombre de pages visitées par l’utilisateur à
qui appartient l’identifiant.

7. Donnez l’instruction SQL permettant de créer la table « logins » (ou


alternativement, décrivez la procédure que vous utiliseriez sous phpMyAdmin
pour créer cette table).
CREATE TABLE LOGINS(
Id varchar(8) NOT NULL,
Pass varchar(8) NOT NULL,
Nb_pages int,
PRIMARY KEY (id)
);

8. Donnez les instructions PHP à inclure dans le fichier « auth.php » permettant


de récupérer dans la table « logins » le triplet (identifiant, mot de passe, pages
visitées) correspondant à l’utilisateur mémorisé dans la session.

//$host="localhost";
//$utilisateur="root";
//$motdepasse="";
//$base="acces";
try{
$connexion = new PDO('mysql:host=localhost;dbname=acces,'root','');
}
catch(Exception $erreur){
die('Erreur de connexion'. $erreur->GetMessage() );
}
$requete = ‘select * from logins where id=$_SESSION["id"] ‘;
try {
$reponse = $connexion->query($requete) ;
}
catch (Exception $e) {
die("Erreur à l'exécution de la requête $requete" . $e->getMessage() );
}

VCIel PHP / MySQL, mai 2007 page 4/6


9. Réécrivez la réponse à la question 6 en distinguant les deux cas de figure :
identifiant inconnu, ou mot de passe incorrect. Comment peut-on modifier le
fichier « id.html » pour inclure le message d’erreur approprié avant de re-
demander à l’utilisateur de s’identifier ?

If (($ligne = $reponse->fetch(PDO::FETCH_OBJ) ) {
if ($ligne->pass != $_SESSION["passe"]) {
// mot de passe incorrect
header("Location: id.html");
}
}
Else{
// identifiant inconnu
header("Location: id.html");
}

10. En cas d’authentification correcte, inclure les instructions permettant


d’incrémenter dans la table, le nombre de pages visitées par cet utilisateur.

VCIel PHP / MySQL, mai 2007 page 5/6


11. En utilisant la bibliothèque GD, concevez un
script permettant de présenter sous la forme
d’un histogramme (cf ci-contre), les différents
utilisateurs du site, et le nombre de pages
visitées par ces utilisateurs sur le site.

//$host="localhost";
//$utilisateur="root";
//$motdepasse="";
//$base="acces";
try{
$connexion = new PDO('mysql:host=localhost;dbname=acces,'root','');
}
catch(Exception $erreur){
die('Erreur de connexion'. $erreur->GetMessage() );
}
$requete = ‘select id,nb_pages from logins ‘;
try {
$reponse = $connexion->query($requete) ;
}
catch (Exception $e) {
die("Erreur à l'exécution de la requête $requete" . $e->getMessage() );
}
$i=0 ;
while ($ligne = $reponse->fetch(PDO::FETCH_OBJ) ) {
$tab_id[$i]= $ligne->id;
$tab_pages[$i]= $ligne->nb_pages;
$i++ ;
}

$lignes = 500;
$colonnes = 500;
$image = imageCreate($lignes, $colonnes);
$fond = imagecolorallocate($image, 255, 255, 0); // la couleur de fond... ici : jaune !
$barre = imageColorAllocate($image, 255, 0, 0); // la couleur des barres... ici : rouge !
$text = imageColorAllocate($image, 0, 0, 0); // la couleur des barres... ici : noir !

$nb_lignes = count($tab_id);
$barre_height = intval ( ($colonnes - $nb_lignes*2)/ $nb_lignes );

for ($i = 0; $i <$nb_lignes; $i++) {


$x1 = 0;
$y1 = $i * ($barre_height + 2);
$x2 = $tab_pages[$i]*10;
$y2 = $y1 + $barre_height;
imageFilledRectangle($image, $x1, $y1, $x2, $y2, $barre );
imagestring(($image,2,5,($y2-$y1)/2, $tab_id[$i].’ : ‘.$tab_pages[$i] ,$trxt)
}

header("Content-type: image/png");
imagepng($image);

VCIel PHP / MySQL, mai 2007 page 6/6

Vous aimerez peut-être aussi