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 ! |