Quand on réalise son site en PHP, on est souvent amené à créer une zone "Admin" où l'accès est limité… Et il vaut mieux, vu que les personnes qui ont accès à la zone Admin peuvent en général tout supprimer si elles le désirent.
Supposons qu'on ait créé un dossier "Admin" dans lequel il y a tous les fichiers d'administration de son site. Comment empêcher que n'importe qui accède à ces pages ?
C'est là que les fichiers .htaccess vont bien nous aider : on peut très facilement créer une protection par Login / Mot de passe qui empêche l'accès à tous les fichiers du dossier.
Il va falloir créer 2 fichiers :
- .htaccess : ce fichier contiendra l'adresse du .htpasswd et quelques autres options qu'on pourra définir.
- .htpasswd : ce fichier contiendra une liste de logins / mots de passe, pour chaque personne autorisée à accéder aux pages !
Sommaire
Créer le .htaccess
La première étape est de créer sur son disque dur un fichier appelé ".htaccess". Mais là, on va certainement avoir un problème.
En effet, Windows n'aime pas les fichiers qui commencent par un point. Pour tous les autres systèmes d'exploitation (Mac OS, Linux) on n'aura aucun problème. Mais Windows lui il veut pas… sauf si on utilise une petite astuce qu'on verra plus loin.
Commençons par ouvrir Bloc-Notes.
Dedans, on va rentrer des informations qui n'ont rien à voir avec du HTML ou du PHP : ce sont des instructions pour le serveur. Elles vont expliquer au serveur que seules certaines personnes sont autorisées à accéder au dossier. Y copier ce code :
Code : Apache
AuthName "Page d'administration protégée"
AuthType Basic
AuthUserFile "/home/sdz/www/gestion/admin/.htpasswd"
Require valid-user
Parmi ces 4 lignes, il y en a 2 qu'on va devoir changer :
- AuthName : c'est le texte qui invitera l'utilisateur à inscrire son login / mot de passe. On peut personnaliser ce texte comme bon nous semble.
- AuthUserFile : là c'est plus délicat, c'est le chemin absolu vers le fichier .htpasswd (qu'on mettra dans le même répertoire que le .htaccess).
 |
Mais comment je trouve ce chemin absolu ? |
En effet, c'est la plupart du temps délicat à trouver. Heureusement, il existe une fonction PHP qui va beaucoup nous aider :
realpath.
Cette fonction donne le chemin absolu vers le fichier qu'on indique. On va donc faire comme ceci pour trouver le chemin absolu :
- Créer un fichier appelé "chemin.php".
- Y mettre juste cette ligne de code dedans :
- Envoyer ce fichier sur son serveur avec son logiciel FTP. Le placer dans le dossier qu'on veut protéger.
- Ouvrir son navigateur et aller voir ce fichier PHP. Il nous donne le chemin absolu, par exemple dans notre cas :
/home/sdz/www/gestion/admin/chemin.php
- Copier ce chemin dans notre .htaccess, et remplacer le "chemin.php" par ".htpasswd", ce qui nous donne au final par exemple :
/home/sdz/www/gestion/admin/.htpasswd
- Supprimer le fichier "chemin.php" de son serveur, il ne nous sert plus à rien maintenant qu'il nous a donné le chemin absolu
La ligne AuthUserFile indique donc où se trouve le fichier .htpasswd qui contient les mots de passe.
 |
Ceux hébergés chez Free, il y a une petite subtilité dans la gestion de la localisation du .htpasswd : on ne doit pas renseigner la ligne AuthUserFile par le chemin absolu du fichier, mais par son chemin relatif à partir de la racine de son espace perso.
Exemple : si on utilise un espace Free nommé monftpfree, et qu'on place son fichier .htpasswd dans un répertoire admin, le fichier "chemin.php" nous renverra un chemin sous la forme :
/mnt/XXX/sda/X/X/monftpfree/admin/.htpasswd .
On doit alors simplement utiliser /monftpfree/admin/.htpasswd . |
Enregistrer le fichier en mettant le nom entre guillemets, comme ceci :
".htaccess"
. Cela permet de forcer Windows à enregistrer le fichier, parce qu'avec le point au début en temps normal il ne veut pas ou il fait n'importe quoi.
Maintenant qu'on a fini de créer le .htaccess, on peut maintenant passer au .htpasswd.
Créer le .htpasswd
Créons maintenant un nouveau fichier avec Bloc-Notes.
Le .htpasswd contient la liste des personnes autorisées à accéder aux pages du dossier.
On met une personne par ligne, sous cette forme :
login:mot_de_passe_crypté
Au final, le fichier .htpasswd ressemblera à ceci :
Code : Autre
mateo21:$1$MEqT//cb$hAVid.qmmSGFW/wDlIfQ81
darkeden:$1$/lgP8dYa$sQNXcCP47KhP1sneRIZoO0
AIAN:$1$lT7nqnsg$cVtoPfe0IgrjES7Ushmoy.
Leon:$1$h4oVHp3O$X7Ejpn.uuOhJRkT3qnw3i0
Dans cet exemple, il y a 4 personnes autorisées à accéder au dossier : ce sont mateo21, darkeden, IAN, et Leon.
S'il n'y a qu'une personne autorisée à accéder au dossier, on n'aura qu'à mettre qu'une ligne. Mais si on est plusieurs admins, il est très pratique de pouvoir créer plusieurs "comptes" avec login / mot de passe.
 |
Comment on crypte les mots de passe ? |
Encore une fois, il y a une super fonction PHP qui va nous tirer d'affaire :
crypt. On lui donne un mot de passe et, ne pas chercher à savoir comment, ça nous le crypte.
Par exemple, si mon mot de passe est "kangourou", voici le code PHP que je devrai écrire pour l'obtenir en version cryptée :
Crypter ses mots de passe est très utile : en effet, si quelqu'un vient un jour à lire notre fichier .htpasswd (quelqu'un qui utilise le même PC que nous par exemple), il ne verra que le mot de passe crypté.
Et là, aucun risque qu'il ne retrouve notre mot de passe : ce cryptage est indéchiffrable. C'est donc très pratique.
Voici un petit script qui va bien nous être utile. voyons si on comprend ce script :
Code PHP
<p>
<?php
if (isset($_POST['login']) AND isset($_POST['pass']))
{
$login = $_POST['login'];
$pass_crypte = crypt($_POST['pass']); // On cryte le mot de passe
echo 'Ligne à copier dans le .htpasswd :<br />' . $login . ':' . $pass_crypte;
}
else // On n'a pas encore rempli le formulaire
{
?>
</p>
<p>Entrez votre login et votre mot de passe pour le crypter.</p>
<form method="post">
<p>
Login : <input type="text" name="login"><br />
Mot de passe : <input type="text" name="pass"><br /><br />
<input type="submit" value="Crypter !">
</p>
</form>
<?php
}
?>
Il y a 2 parties dans ce code, dont la forme est similaire aux TP "Page protégée par mot de passe", "Mini-Chat", etc…
- SI les variables $_POST['login'] et $_POST['pass'] existent, alors c'est qu'on vient de valider le formulaire.
On crypte le mot de passe qu'on a rentré, et on affiche $login:$pass_crypte pour qu'on n'ait plus qu'à copier la ligne dans le .htpasswd
- SINON, si les variables $_POST['login'] et $_POST['pass'] n'existent pas, donc on affiche le formulaire pour demander d'entrer un login et un mot de passe.
Le formulaire recharge la même page, car il n'y a pas d'attribut action dans la balise <form> comme on l'a vu dans le chapitre sur les formulaires. Lors du rechargement de la page, les variables $_POST['login'] et $_POST['pass'] existeront puisqu'on vient d'entrer le login et le mot de passe. Le mot de passe sera alors crypté !
Il est conseillé de créer cette page quelque part sur son disque dur (ou sur son serveur peu importe), pour qu'on puisse crypter rapidement ses mots de passe pour le .htpasswd.
 |
Ceux hébergés chez Free, ils ne DOIVENT PAS crypter leurs mots de passe. En effet, Free demande à ce que les mots de passe ne soient pas cryptés (ce qui est complètement nul pour la sécurité, mais bon…). Ils doivent donc taper le mot de passe directement. |
Envoyer les fichiers sur le serveur
On a maintenant 2 fichiers sur son disque dur : .htaccess et .htpasswd.
Lancer son logiciel FTP. Transférer les fichiers .htaccess et .htpasswd dans le dossier qu'on veut protéger par mot de passe.
On devrait voir ceci dans le logiciel FTP :
Voilà, désormais le dossier est protégé
Si quelqu'un essaie d'accéder à une des pages du dossier (admin_commentaires.php, admin_livreor.php…), alors il obtiendra une fenêtre comme celle-ci lui demandant de se logger :
Si on rentre le bon login avec le bon mot de passe, on est alors autorisé à accéder aux pages !