Certains sites web ne sont pas accessibles à n'importe-qui : pour pouvoir y accéder, il faut être un utilisateur authentifié (c'est à dire posséder un login et un mot de passe). C'est le cas du site sur lequel se trouve cet atelier : http://www.bts-sio.com/.
Grâce à cet atelier, nous allons mettre en oeuvre une des techniques qui permettent de mettre en place ces protections. Les utilisateurs autorisés seront stockés dans une base de données MySQL. L'authentification se fait grâce à PHP.
Les utilisateurs autorisés à se connecter auront leurs identifiants stockés dans une table MySQL. C'est grâce à une requête SQL qu'on vérifiera si un visiteur s'authentifie correctement (bon login, bon mot de passe).
Vous devez créer votre base de données, qui doit avoir comme nom login_db, où login est votre nom d'utilisateur (par exemple : spastore_db).
Vous devez ensuite créer la table Utilisateur, constituée des champs suivants :
Collez ici le code SQL généré par PHPMyAdmin au moment où vous avez créé votre table, et qui sert à créer la table (CREATE TABLE ...) (si vous avez perdu ce code, faite "exporter" de la table) :
Grâce à la commande Insérer de phpMyAdmin, remplissez cette table avec au moins un utilisateur :
Pour que les pages de ce TP ne soient pas mélangées aux autres pages des autres sites déjà présents dans Apache, on va travailler dans un sous-répertoire de la racine Web de Apache.
Créez le sous-répertoire v_anonyme_authentification sous la racine Web de Apache (en 2016-17, la racine Web de Apache est C:\wamp\www\);
Créez également une page index.php, qui représente la page d'accueil de votre site Web. C'est cette page qu'on va se charger de protéger. Elle contient le texte :
Bienvenue sur mon site Web
Dans votre site, créez la page authentification.php (grâce à NotePad++ par exemple).
Cette page doit contenir le formulaire d'authentification, où l'utilisateur peut saisir son login et son mot de passe. Le résultat pourra ressembler à ça :
où le nom du champ login va être : formlogin et le nom du champ mot de passe va être : formpwd. La page appelée lorsque on valide le formulaire est authentification.php
.
Eventuellement, soignez la présentation et l'alignement grâce à un tableau HTML.
Prenez soin à ce que le mot de passe soit discret, c'est à dire qu'on ne le voit ni dans le formulaire (au moment où on le tape), ni dans l'URL (au moment où on soumet le formulaire au serveur).
Dans cette même page, on va rajouter le code PHP qui vérifie l'authentification. Comme souvent dans nos site Web, c'est la même page qui affiche un formulaire puis qui, dans un deuxième temps (lorsqu'on soumet le formulaire et que la page est rappelée), traite ce formulaire.
Le code PHP qui vérifie l'authentification va être placé avant le formulaire. En effet, si l'authentification est correcte, il sera inutile de ré-afficher le formulaire puisqu'on fera une redirection vers la page d'accueil du site (index.php).
Ajoutez maintenant le code PHP qui vérifie l'authentification en respectant la structure suivante (remplacez les TODO par du vai code, les commentaires sans TODO sont juste informatifs) :
Testez, cela devrait marcher : une mauvaise authentification vous réaffiche le formulaire, une bonne authentification vous redirige vers la page d'accueil du site index.php.
Toutefois, vous remarquez que la page d'accueil n'est pas encore vraiment protégée, puisqu'on peut y accéder en tapant son URL dans le navigateur. C'est dans une étape ultérieure que l'on va rendre la protection effective.
Pour se déconnecter, il faut supprimer le cookie d'authentification. Pour supprimer un cookie, il faut appeler setcookie
avec le nom du cookie, et la valeur false
:
setcookie("cookieauthentification", false) ;
Dans la page d'accueil (ou dans le menu si vous travaillez sur un vrai site), ajoutez un lien Déconnexion qui pointe vers une page déconnexion.php
.
La page deconnexion.php supprime le cookie d'authentification et redirige vers la page d'authentification. :
Après avoir vérifié que tout marche (le cookie est bien supprimé), collez ici le code de la page déconnexion.php :
Il est théoriquement possible pour l'utilisateur d'accéder directement à votre page d'accueil index.php, sans passer par la page d'authentification. Il lui suffit d'en taper l'URL dans son navigateur. Pour l'instant, l'authentification est donc inefficace pour la sécurité du site.
Pour améliorer cela, vous allez ajouter le code suivant tout au début de la page index.php :
Remarques : toutes les pages du site, au contenu confidentiel, devront être protégées de la sorte.
Mettez ceci en œuvre, vérifier que la page est bien protégée (si on n'est pas authentifié, on ne peut pas voir la page index.php car on est redirigé vers l'authentification). Collez ici le début de votre page d'accueil :
Ceci est important car, lorsqu'un internaute demande une page, on veut souvent savoir qui il est pour lui envoyer un contenu personnalisé.
Modifiez le code PHP de l'authentification, de façon à ce que "cookieauthentification" contienne la clé primaire de l'utilisateur qui vient de s'authentifier. Pour ça, vous devrez utiliser mysqli_fetch_assoc
lorsque l'authentification est réussie.
Par respect pour les visiteurs de vos sites Web, je recommande très fortement de crypter les mots de passe que ceux-ci confient à vos bases de données.
À l'endroit où l'on vérifie l'authentification, modifier votre code PHP en ajoutant la fonction SHA1 (c'est une fonction MySQL), qui permet de crypter le mot de passe saisi dans le formulaire, afin de le comparer au mot de passe crypté dans la table utilisateur :
select ... where ... pwd=SHA1('$formpwd')
Dans PHPMyAdmin, cryptez les mots de passe de la table en exécutant (une seule fois !) la requête SQL suivante (remarquez bien l'effet de la commande SHA1 sur le contenu de la table !).
update utilisateur set pwd = SHA1(pwd) ;
Testez, l'authentification doit marcher à l'identique.
Collez ici la nouvelle version de la ligne PHP qui exécute la requête d'authentification :
Attention, dans cette étape vous devez être plus autonome.
L'objectif est de faire en sorte que les utilisateurs qui ne sont pas encore stockés dans la base puissent s'inscrire. Ainsi, dès qu'on arrive sur le site, on a le choix entre :
Pour ça, vous devez :
INSERT
.vérifiez que vous arrivez à inscrire un nouveau visiteur, puis à vous loguer sous son compte.
"L'inscription équivaut à une authentification" : Qu'est-ce que cela implique ?
Copiez ici le code HTML qui affiche le formulaire d'inscription :
Copiez ici le code PHP qui effectue l'ensemble de l'inscription :
Pour l'authentification, les améliorations possibles sont :
mysql_myreal_escape_string
, empêcher les requêtes SQL de planter et empêcher l'injection SQL,Pour l'inscription, les améliorations possibles sont :
Si vous pensez à d'autres améliorations, notez-les en commentaire en bas de cette page.