TP 08: LES COOKIES, LES SESSIONS, L’AUTHENTIFICATION…
Exercices
Exercice 1 : Numéro de carte bancaire
a) Ecrire un formulaire html permettant de saisir votre nom, votre prénom et votre numéro de carte bancaire ainsi qu’un champ de 3 caractères pour saisir le code figurant au dos de votre carte.
b) Envoyez ces informations à un programme PHP qui affiche ces informations.
c) Fermez votre navigateur puis appelez de nouveau cette page sans passer par le formulaire.
d) Mémorisez les informations reçues dans un cookie avec une durée de vie de 10 minutes.
e) Modifiez votre programme pour chercher les informations soit dans les données issues du formulaire si vous passez par le formulaire, soit dans les cookies de votre machine si vous ne passez pas par le formulaire.
Vérifiez le fonctionnement.
f) Appelez de nouveau cette page 10 minutes plus tard pour vérifier que les cookies oint été détruits.
Exercice 2 : Authentification
a) Créer une table dans la base de données constituée d’un champ ‘login’ et d’un champ intitulé ‘motDePasse’
permettant de stocker des mots de passe cryptés avec l’algorithme MD5. Alimentez votre table avec quelques valeurs en prenant soin de crypter les mots de passe.
b) Créez un formulaire d’authentification (login + mot de passe) et affichez un message indiquant
« Authentification réussie » ou « login incorrect » ou « mot de passe incorrect ».
Exercice 3 : Authentification pour accéder à un site Inutile d’utiliser les sessions dans cet exercice.
a) A partir de votre formulaire d’authentification, accédez à une page (exemple : votre formulaire du TP précédent) si vous êtes authentifié. Si l’authentification a échoué, affichez de nouveau le formulaire d’authentification.
Conseil : Utiliser « header(‘location : url’) » pour rediriger vers l’url.
Invalide
valide submit
Recup_login.php
Exercice 4 : Authentification avec les sessions
L’exercice précédent n’a pas permis de protéger vos pages. En effet, il suffit de connaître les url des pages pour y accéder. Afin de protéger les pages et de s’assurer que l’utilisateur est authentifié, nous allons utiliser les sessions.
a) A l’authentification, les login et mots de passe seront mémorisés dans des variables de sessions b) A chaque page accédée, la vérification de la connaissance de ces variables de session sera vérifiée.
c) En cas d’accès à une page avec des variables de session incorrectes, on redirige automatiquement vers la page d’authentification.
Exercice 5 : Affichage des variables de sessions et déconnexion
a) Une fois l’utilisateur authentifié, chaque page doit afficher en en-tête le nom de l’utilisateur.
Conseil : Utilisez un « include ».
b) S’il y a erreur sur la personne, proposez une déconnexion et un renvoi vers la page d’authentification. Vous devez impérativement détruire la session !
Exercice 6 : Nombre de sessions …
Essayez de compter et d’afficher le nombre de connexions sur une page en utilisant la même session.
Exercice 7 (s’il vous reste du temps) : Authentification permettant d’accéder à une autre page
Dans cet exercice, le formulaire est public mais les résultats sont accessibles uniquement aux personnes authentifiées. De plus, le formulaire de saisie est inclus dans la page de recherche… On fera apparaître soit le formulaire, soit le résultat…
a) Récupérer une page d’un TP précédent (par exemple « recherche.php »)
b) Ajouter une authentification pour pouvoir accéder à cette page en respectant les consignes suivantes :
• Tant que l(authentification est incorrecte, le formulaire de saisie de login et de mot de passe est affiché
• Préférez les fichiers inclus aux « Copier/coller »
Exercice 8 (s’il vous reste du temps) : Site marchand
Vous devez simuler un site marchand. Les produits à vendre sont à rechercher dans une base de données. Vous stockerez dans des variables de sessions le contenu de votre « panier » (Produits, quantité) ;
En permanence, sur toutes vos pages vous affichez le nombre d’articles et le montant total de votre panier.
Au moment du paiement (simulation), vous transférez votre panier dans des tables « commande » et
« LigneDeCommande » dans la base de données et vous videz votre panier.
CORRECTION DU TP 08
Exercice 1 : Numéro de carte bancaire
a) Ecrire un formulaire html permettant de saisir votre nom, votre prénom et votre numéro de carte bancaire ainsi qu’un champ de 3 caractères pour saisir le code figurant au dos de votre carte.
b) Envoyez ces informations à un programme PHP qui affiche ces informations.
c) Fermez votre navigateur puis appelez de nouveau cette page sans passer par le formulaire.
d) Mémorisez les informations reçues dans un cookie avec une durée de vie de 10 minutes.
e) Modifiez votre programme pour chercher les informations soit dans les données issues du formulaire si vous passez par le formulaire, soit dans les cookies de votre machine si vous ne passez pas par le formulaire.
Vérifiez le fonctionnement.
f) Appelez de nouveau cette page 10 minutes plus tard pour vérifier que les cookies oint été détruits.
<!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" lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Formulaire de saisie</title>
<style type="text/css">
body {
background-color:#ffd;
font-family:Verdana,Helvetica,Arial,sans-serif size:10;
}
</style>
</head>
<body>
<h2>Formulaire de saisie d'informations bancaires</h2>
<form action="recup_infosBancaires.php" method="post">
<table>
<tr><td>
Prénom</td><td><input type="text" name="prenom" /></td></tr>
<tr><td>Nom</td><td><input type="text" name="nom" /></td></tr>
<tr><td>Numéro de carte bancaire</td><td><input type="text" name="numCB"
/></td></tr>
<tr><td>Cryptogramme</td><td><input type="text" name="crypto" size="3"
maxlength="3"/></td></tr>
</table>
<p>
<input type="reset" name="reset" value="Annulez" />
<input type="submit" name="formBancaire" value="Envoyez" />
</p>
</form>
</body>
</html>
Exercice 2 : Authentification
a) Créer une table dans la base de données constituée d’un champ ‘login’ et d’un champ intitulé ‘motDePasse’
permettant de stocker des mots de passe cryptés avec l’algorithme MD5. Alimentez votre table avec quelques valeurs en prenant soin de crypter les mots de passe.
b) Créez un formulaire d’authentification (login + mot de passe) et affichez un message indiquant
« Authentification réussie » ou « login incorrect » ou « mot de passe incorrect ».
<?PHP
if (isset($_POST['prenom']) && isset($_POST['nom']) && isset($_POST['crypto']) &&
isset($_POST['numCB'])){
echo "<h2>Coordonnées bancaires:</h2>\n";
echo "<p>".$_POST['prenom']." ".$_POST['nom'].", on connait votre numéro de carte: ";
echo $_POST['numCB']." et votre cryptogramme:
".$_POST['crypto']."</p>\n";
setCookie('nom',$_POST['nom'],time()+10*60);
setCookie('nom',$_POST['nom'],time()+10*60);
setCookie('prenom',$_POST['prenom'],time()+10*60);
setCookie('numCB',$_POST['numCB'],time()+10*60);
setCookie('crypto',$_POST['crypto'],time()+10*60);
} else{
if (isset($_COOKIE['prenom']) && isset($_COOKIE['nom']) &&
isset($_COOKIE['crypto']) && isset($_COOKIE['numCB'])){
echo "<h2>Coordonnées bancaires:</h2>\n";
echo "<p>".$_COOKIE['prenom']." ".$_COOKIE['nom'].", on connait votre numéro de carte: ";
echo $_COOKIE['numCB']." et votre cryptogramme:
".$_COOKIE['crypto']."</p>\n";
echo "<p>Nous avons retrouvé ces informations bancaires dans les cookies de votre ordinateur !!!</p>\n";
} else{
echo "<h2>Coordonnées bancaires:</h2>\n";
echo "<p>Elles nous sont inconnues car vous n'avez utilise ni le formulaire ni les cookies \n";
} }
?>
<?PHP
if (isset($_POST['login']) && isset($_POST['mdp'])){
if (empty($_POST['login'])) echo "<p>Login non renseigné dans le formulaire !</p>\n";
else{
// Recherche dans la base de données include('connexion.inc.php');
/* // Méthode de parcours de table en php.... Compliqué pour rien !!!
$req = "SELECT * FROM authentification;";
$result=mysqli_query($link,$req);
$trouve=FALSE;
$mdp=FALSE;
while(($ligne=mysqli_fetch_array($result)) && (! $trouve)){
if ($ligne[0]==$_POST['login']){
$trouve=TRUE;
if ($ligne[1]==md5($_POST['mdp'])){
$mdp=TRUE;
} }
}
if ($trouve && $mdp){
$authentifie=TRUE;
}
*/
// Méthode de recherche du login grâce à SQL
$req = "SELECT * FROM authentification WHERE login='".$_POST['login']."' AND motDePasse='".md5($_POST['mdp'])."';";
$result=mysqli_query($link,$req);
if (mysqli_num_rows($result)==1)
// if ($trouve && $mdp) echo "<p>Authentification réussie</p>\n";
// else{
// if ($trouve) echo "<p>Mot de passe incorrect.</p>\n";
// else echo "<p>Login inconnu dans notre base de données.</p>\n";
}}
} else{
echo "<p>Vous devez passser par le formulaire de saisie !!!</p>\n";
Exercice 3 : Authentification pour accéder à un site Inutile d’utiliser les sessions dans cet exercice.
b) A partir de votre formulaire d’authentification, accédez à une page (exemple : votre formulaire du TP précédent) si vous êtes authentifié. Si l’authentification a échoué, affichez de nouveau le formulaire d’authentification.
Conseil : Utiliser « header(‘location : url’) » pour rediriger vers l’url.
Invalide
valide submit
Recup_login.php
Recup_login.php
<?PHP
if (isset($_POST['login']) && isset($_POST['mdp'])){
// Recherche dans la base de données include('connexion.inc.php');
/* // Méthode de parcours de table en php.... Compliqué pour rien !!!
$req = "SELECT * FROM authentification;";
$result=mysqli_query($link,$req);
$trouve=FALSE;
$mdp=FALSE;
while(($ligne=mysqli_fetch_array($result)) && (! $trouve)){
if ($ligne[0]==$_POST['login']){
$trouve=TRUE;
if ($ligne[1]==md5($_POST['mdp'])){
$mdp=TRUE;
} }
}
if ($trouve && $mdp){
$authentifie=TRUE;
}
*/
// Méthode de recherche du login grâce à SQL
$req = "SELECT * FROM authentification WHERE login='".$_POST['login']."' AND motDePasse='".md5($_POST['mdp'])."';";
$result=mysqli_query($link,$req);
if (mysqli_num_rows($result)==1) header('location:form_BD.php');
else
header('location:form_login.html');
}
else header('location:form_login.html');
?>
Form_BD.php
<?php
/* connexion à la base de données (a faire dès le début, en tout cas pas dans un formulaire, sinon message invisible) */
include('connexion.inc.php');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
// …/…
<option value="" selected="selected">-- service --</option>
<?php
$requete= "SELECT * FROM t_service;";
//$result=mysql_query($requete);
$result=mysqli_query($link,$requete);
while($ligne=mysqli_fetch_array($result)) echo '<option
value="'.$ligne['code_service'].'">'.$ligne['lib_service'].'</option>'."<br />\n";
?>
</select>
</p><p>
Loisirs <br />
<?php
$requete= "SELECT * FROM t_loisir;";
//$result=mysql_query($requete);
$result=mysqli_query($link,$requete);
while($ligne=mysqli_fetch_array($result)) {
echo '<input type="checkbox" name="loisirs[]" value="';
echo $ligne['code_loisir'];
echo '" />'.$ligne['lib_loisir']."<br/>\n";
}
//mysql_close();
mysqli_close($link);
?>
</p>
<p>
<input type="reset" name="reset" value="Effacez" />
<input type="submit" name="submit" value="Validez" />
</p>
</form>
</body>
</html>
Recherché.php
Exercice 4 : Authentification avec les sessions
L’exercice précédent n’a pas permis de protéger vos pages. En effet, il suffit de connaître les url des pages pour y accéder. Afin de protéger les pages et de s’assurer que l’utilisateur est authentifié, nous allons utiliser les sessions.
a) A l’authentification, les login et mots de passe seront mémorisés dans des variables de sessions b) A chaque page accédée, la vérification de la connaissance de ces variables de session sera vérifiée.
c) En cas d’accès à une page avec des variables de session incorrectes, on redirige automatiquement vers la page d’authentification.
Recup_login.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" lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Affichage d'une personne recherchée</title>
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h1>Affichage d'une personne recherchée</h1>
<?php
/* connexion à la base de données (a faire dès le début, en tout cas pas dans un formualire, sinon message invisible) */
include('connexion.inc.php');
$nom=$_GET['nom'];
$requete="SELECT * FROM t_personne WHERE nom LIKE '$nom%'";
$result=mysqli_query($link,$requete);
$nb=mysqli_num_rows($result);
echo "<p>Il y a $nb enregistrement(s) trouvé(s)</p>";
echo '<p>';
while($ligne=mysqli_fetch_assoc($result)) // ou mysqli_fetch_array ou mysqli_fetch_row($result)
echo $ligne['num'].' - '.$ligne['nom'].' - '.$ligne['prenom'].' - '.$ligne['service']."<br />\n";
mysqli_close($link);
?>
</p>
</body>
</html>
// Méthode de recherche du login grâce à SQL
$req = "SELECT * FROM authentification WHERE login='".$_POST['login']."' AND motDePasse='".md5($_POST['mdp'])."';";
$result=mysqli_query($link,$req);
if (mysqli_num_rows($result)==1){
session_start();
$_SESSION['login']=$_POST['login'];
$_SESSION['mdp']=$_POST['mdp'];
header('location:form_BD.php');
} else
header('location:form_login.html');
}
else header('location:form_login.html');
form_recherche.php
Recherche.php
Exercice 5 : Affichage des variables de sessions et déconnexion
c) Une fois l’utilisateur authentifié, chaque page doit afficher en en-tête le nom de l’utilisateur.
Conseil : Utilisez un « include ».
Entete.inc.php
d) S’il y a erreur sur la personne, proposez une déconnexion et un renvoi vers la page d’authentification. Vous devez impérativement détruire la session !
Deconnexion.php
Exercice 6 : Nombre de sessions …
Essayez de compter et d’afficher le nombre de connexions sur une page en utilisant la même session.
Mettre un compteur dans une variable de session et incrémenter à chaque fois.
<?php
session_start();
/* connexion à la base de données (a faire dès le début, en tout cas pas dans un formulaire, sinon message invisible) */
if (!isset($_SESSION['login']) || ! isset($_SESSION['mdp'])) header('location:form_login.html');
include('connexion.inc.php');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
<?php
session_start();
/* connexion à la base de données (a faire dès le début, en tout cas pas dans un formulaire, sinon message invisible) */
if (!isset($_SESSION['login']) || ! isset($_SESSION['mdp'])) header('location:form_login.html');
include('connexion.inc.php');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
<?php
echo '<p style="color: blue; font-size: 70%";>';
echo "<i>Vous êtes authentifié ! Vous êtes l'utilisateur
".$_SESSION['login'];
echo "</i><br/>";
echo "Si vous n'êtes pas ".$_SESSION['login'].", cliquez sur ";
echo '<a href="deconnexion.php">déconnexion</a>.</p><hr/>'."\n";
?>
<?php
session_start();
session_destroy();
header("location:form_login.html");
?>
Exercice 7 (s’il vous reste du temps) : Authentification permettant d’accéder à une autre page
Dans cet exercice, le formulaire est public mais les résultats sont accessibles uniquement aux personnes authentifiées. De plus, le formulaire de saisie est inclus dans la page de recherche… On fera apparaître soit le formulaire, soit le résultat…
c) Récupérer une page d’un TP précédent (par exemple « recherche.php »)
d) Ajouter une authentification pour pouvoir accéder à cette page en respectant les consignes suivantes :
• Tant que l(authentification est incorrecte, le formulaire de saisie de login et de mot de passe est affiché
• Préférez les fichiers inclus aux « Copier/coller »
Authentification.php
Authentification.php est inclus dans recherche.php
Authentification.php appelle grâce aux include le form_login.php
<?PHP
// Méthode 1: sans header mais avec des include
$authentifie=FALSE;
if (isset($_POST['login']) && isset($_POST['mdp'])){
// Recherche dans la base de données include('connexion.inc.php');
// Méthode de recherche du login grâce à SQL
$req = "SELECT * FROM authentification WHERE login='".$_POST['login']."' AND motDePasse='".md5($_POST['mdp'])."';";
$result=mysqli_query($link,$req);
if (mysqli_num_rows($result)==1){
$authentifie=TRUE;
}
else include('form_login1.html');
}
else include('form_login1.html');
?>