Gestion des utilisateurs d'un site Internet Pourquoi gérer des utilisateurs ? * Pour identifier les acteurs * Différents rôles * Rédaction de commentaires (visiteur) * Rédaction d'articles (rédacteur) * Vérification du contenu (modérateur) * Traçabilité des données * Suivi des contributions de chacun * Responsabilités et droits des auteurs * Modération du contenu * Exclusion d'un utilisateur Inscription * Inscription simple * Login et mot de passe * Validation automatique * Inscription avancée * Informations personnelles * Courier électronique * Procédure de vérification * Procédure de vérification * Anti-robot à l'inscription: "CAPTCHA" * Procédure de vérification par courrier * Electronique * Postal Réglementation sur les données personnelles * Protection de la vie privée * Utilisation du numéro INSEE soumise à autorisation * Déclaration à la CNIL * Commission Nationale de l'Informatique et des Libertés * http://www.cnil.fr * Déclaration * Type de données * Durée de stockage * Utilisation * Droit de l'utilisateur * Regard * Modification * Suppression Modélisation du site pour le cinéma * Proposer un diagramme des cas d'utilisation et un diagramme de classes pour la gestion des utilisateurs * Proposer un modèle entité-association de la base de données pour la gestion des utilisateurs * Quelles sont les modifications à apporter aux tables existantes ? * Proposer un schéma de navigation et une esquisse des pages pour la gestion des utilisateurs * Quelles sont les modifications à apporter au schéma existant ? Cas d'utilisation: identification Cas d'utilisation: inscription Cas d'utilisation: gestion Diagramme de classes: utilisateurs Modèle entité-association 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 * Préférences / options sur le site * Pages visitées par un client Côté client: les cookies Cookie en PHP (1/2) * setcookie(string $nom,string $valeur, int $expiration,string $chemin, string $domaine,int $securise) * $nom et $valeur: nom et valeur du cookie * $expiration: date de suppression du cookie * Nombre de secondes depuis le 1 janvier 1970 * time(): pour la date courante * mktime($h,$m,$s,$m,$j,$a): pour une date donnée * $chemin: chemin dans le site où le cookie est valide * "/" (la racine du site) par défaut * $domaine: nom du domaine où le cookie est valide * ".nawouak.net" signifie les adresses "http://*.nawouak.net" * Attention au premier "." dans le nom du domaine * $securise: envoi du cookie par protocole sécurisé (HTTPS) ? * Valeur 1 signifie un envoi sécurisé * Par défaut, non sécurisé Cookie en PHP (2/2) * Placé avant l'envoi de l'entête au client * Avant balise <html> * Avant toute commande "echo" * Supprimer un cookie * Affecter une date d'expiration dans le passé * setcookie("mon_cookie","",time()-3600); * Exemple * Création: setcookie("nom","Nawouak",time()+3600); * Récupération: echo $_COOKIE["nom"]; * Tous les cookies associés à un nom de domaine sont transmis à chaque requête HTTP sur ce domaine 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 * 300 cookies par client * 20 cookies par domaine * 4000 octets par cookie * 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 et indépendante de la méthode de transmission * Données stockées dans le tableau associatif "_SESSION" * Ajout d'une variable: $_SESSION["nom_variable"] = valeur; * Récupération d'une variable: 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" Méthodes de transmission de l'identifiant * Passage de l'identifiant en paramètre dans l'URL * Exemple: index.php?sid=1234567890 * $nom = session_name(): nom du paramètre * $sid = session_id(): identifiant de la session * echo "<a href='index.php?$nom=$sid'>...</a>"; * Paramètre récupéré automatiquement dans la page cible * Transmission automatique et invisible par l'URL * Méthode précédente mais totalement transparente * Configuration de PHP: option "session.use_trans_id" * Cookie contenant l'identifiant * Cookie transmis dans chaque requête HTTP * Configuration de PHP: option "session.use_cookies" * Problème si le client refuse les cookies * Choix de la méthode effectué à la configuration du serveur * Transmission de l'identifiant souvent transparente 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 * 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 Exercice: connexion d'un utilisateur * Ecrire un formulaire de saisie des identifiants * Ecrire une page de vérification des identifiants * Vérification dans la base "utilisateur" * Si valide * Mémoriser les identifiants dans une session * Rediriger sur une page de contenu * Si non valide * Rediriger sur une page d'inscription * Ecrire une page de contenu * Afficher l'utilisateur connecté * Ecrire une page de validation d'une inscription * Vérifier que l'utilisateur connecté est un administrateur * Afficher toutes les inscriptions à valider * Proposer un lien pour accepter (accept.php?id=xx) * Proposer un lien pour refuser (reject.php?id=xx) 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 ! |