Chapitre 5
AUTHENTIFICATION DES UTILISATEURS
D'UN SITE INTERNET
 
 
Précédent Suivant
 

Authentification des utilisateurs
d'un site Internet
Mémoriser des données entre pages
* Exemple: l'identifiant d'un utilisateur
* Vérification de l'identité d'un utilisateur
* Ensuite, utilisation de son identifiant
* Méthodes de transfert "get" et "post"
* Transfert de données entre pages
* Echange de l'identifiant de l'utilisateur à chaque fois
* Lourdeur du procédé
* Problème de sécurité
* Idéalement, il faudrait des "variables globales"
* Zone d'échange entre différentes pages
* Il existe deux mécanismes
* Côté client: les cookies
* Côté serveur: les sessions
Qu'est-ce qu'un cookie ?
* Donnée stockée par un serveur chez le client
* Ordre du serveur en réponse à une requête HTTP
* Reçu et interprété par le navigateur
* Données stockées sous forme texte sur la machine
* Mémorise de l'information entre deux visites
* A chaque requête HTTP, le(s) cookie(s) sont transmis
* Seuls les cookies du site concerné sont envoyés
* Permet de mémoriser
* Identifiant d'un utilisateur (déconseillé)
* Préférences / options sur le site
* Pages visitées par un client
Côté client: les cookies
Avantages et inconvénients des cookies
* Avantages
* Peut conserver des données entre deux visites
* Durée de vie des données contrôlée
* Mort programmée par le serveur
* Le client peut détruire les données
* Nettoyage par le navigateur
* Inconvénients
* Le client peut refuser les cookies
* Quantité de données stockées limitée
* Problème de sécurité
* Echange de données entre client et serveur
* Par défaut, aucune sécurisation
* Possibilité de sécuriser le transfert
* Données stockées chez le client
* Possibilité de récupérer le cookie d'un autre
Qu'est-ce qu'une session ?
* Correspond à une visite d'un utilisateur
* Identifiant attribué aléatoirement au début de la visite
* Identifiant transmis à chaque page durant la visite
* Identifiant = SID (Session IDentifier)
* L'identifiant permet d'échanger des données entre pages
* Zone de stockage attribuée pour l'identifiant sur le serveur
* Une page peut déposer des informations dans la zone
* Une autre peut récupérer ces informations dans la zone
* L'identifiant doit être transmis entre les pages
* Plusieurs méthodes de transmission
Côté serveur: les sessions
Session en PHP
* Fonction "session_start" ouvre une session
* Création d'un nouvel SID si l'utilisateur n'en a pas
* Sinon, récupération du SID de l'utilisateur
* A partir du SID, récupération des données de la session
* Procédure totalement automatique
* Données stockées dans le tableau associatif "_SESSION"
* Permet de sauver des informations
* Association variable-valeur
* $_SESSION["nom_variable"] = valeur;
* Permet de récupérer des informations déjà stockées
* echo $_SESSION["nom_variable"];
* Suppression d'une session ? "logout"
* session_destroy();
* Données de la session détruites
* SID rendu invalide
* Utiliser ces commandes avant tout affichage
* Avant la balise <html>
* Avant toute commande "echo"
Avantages et inconvénients des sessions
* Avantages
* Fonctionne toujours, le client ne peut pas refuser
* Aucune limite à la quantité de données stockées
* Pas d'échange de données avec le client
* Plus de problème de sécurité
* Données uniquement stockées sur le serveur
et consultables seulement à partir du SID
* Inconvénients
* Durée de vie limitée au temps de la visite
* Impossible de conserver des données entre deux visites
* La session peut être fermée pendant la visite
* Durée de vie de la session programmée
* Réinitialisation du compteur de vie à chaque accès au site
* Aucun accès pendant une durée donnée
==> fermeture de la session
Authentifier un utilisateur (1/4)
* Page de connexion
* Saisie du login et du mot de passe
* Vérification de leur validité
* Sauvegarde login + m.d.p. dans une session
* Autres pages
* Récupération login + m.d.p. de la session
* Vérification de leur validité
* Si non valide, retour à la page de connexion
* Pourquoi stocker login + m.d.p. au lieu de l'identifiant ?
* L'identifiant peut devenir invalide
* Exemple: utilisateur supprimé pendant la visite
Authentifier un utilisateur (2/4)
* On suppose une table "utilisateur"
* "id": clé primaire, numéro de l'enregistrement
* "login": chaîne de caractères, identifiant de l'utilisateur
* "mdp": chaîne de caractères, mot de passe de l'utilisateur
* Formulaire pour saisir login + m.d.p.
<form method="post" action="login.php">
<p>Identifiant:
<input type="text" name="login"/></p>
<p>Mot de passe:
<input type="password" name="pass"/></p>
<p><input type="submit"/></p>
</form>
* Transmission au fichier "login.php"
Authentifier un utilisateur (3/4)
* Vérification du mot de passe: page "login.php"
<?php
include("connexion.php");
$login = @$_POST["login"];
$mdp = @$_POST["pass"];
$cnx = connexion();
$requete = "SELECT * FROM utilisateur
WHERE login='$login' AND mdp='$mdp'";
$result = @mysqli_query($cnx,$requete);
$nb_ligne = @mysqli_num_rows($result);
@mysqli_close($cnx);
if ($nb_ligne == 0) {
header("Location: connexion_prob.php");
return;
}
/* Utilisateur authentifié */
session_start();
$_SESSION["login"]=$login;
$_SESSION["pass"]=$mdp;
header("Location: connexion_ok.php");
?>
Authentifier un utilisateur (4/4)
* Dans chaque page, vérifier les identifiants
<?php
include("connexion.php");
session_start();
$login = @$_SESSION["login"];
$mdp = @$_SESSION["pass"];
$cnx = connexion();
$requete = "SELECT * FROM utilisateur
WHERE login='$login' AND mdp='$mdp'";
$result = @mysqli_query($cnx,$requete);
$nb_ligne = @mysqli_num_rows($result);
@mysqli_close($cnx);
if ($nb_ligne == 0) {
header("Location: connexion_prob.php");
return;
}
/* Utilisateur authentifié */
...
?>
Sécurité: pourquoi crypter les mots de passe ?
* Le problème
* Souvent, même mot de passe pour plusieurs accès
* Les administrateurs peuvent voir les mots de passe
* Le risque
* Serveur craqué = personne non autorisée devient administrateur
* Les mots de passe permettent l'accès à des sites plus sensibles
* Cryptage par fonction de hachage
* Considéré comme une forme puissante de cryptage
* Génère une valeur quasi unique à partir d'un texte
* Processus supposé à sens unique
* Puissance de calcul inimaginable pour inverser le processus
Cryptage des mots de passe (1/2)
Cryptage des mots de passe (2/2)
* Utilisation de la fonction de cryptage de MySQL
* Vérification
SELECT * FROM utilisateur
WHERE (login='$login' AND mdp=MD5('$password'))
* Ajout
INSERT INTO utilisateur (login,mdp)
VALUES ('$login',MD5('$password'))
* Utilisation de la fonction de cryptage de PHP
* if ($enr["mdp"] == md5($password)) ...
* Attention: l'encodage de l'attribut est précis !