Protéger un dossier avec un .htaccess
Protéger un dossier avec un .htaccess
-
Objectifs
- Être capable de protéger un dossier dans son serveur avec le ficher .htaccess
-
Présentation
- Lorsque vous réalisez votre site en PHP, vous êtes souvent amené à créer une zone « Admin » 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 que vous ayez créé un dossier Admin qui contient tous les fichiers d’administration de votre site. Comment empêcher que n’importe qui accède à ces pages ?
- C’est là que les fichiers
.htaccess
vont 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. - Pour cela, il va falloir créer deux fichiers :
-
.htaccess
: ce fichier contiendra l’adresse du fichier.htpasswd
et quelques autres options que vous pourrez définir ; .htpasswd
: ce fichier contiendra une liste de logins/mots de passe, pour chaque personne autorisée à accéder aux pages !-
Créer le
.htaccess
- La première étape est de créer sur votre disque dur un fichier appelé
.htaccess
. - Ce fichier n’a pas de nom mais seulement une extension, à savoir
.htaccess
. Ne soyez donc pas étonné s’il commence par un point. - Ouvrez un nouveau fichier avec votre éditeur de texte favori. Nous allons écrire des lignes de code qui n’ont rien à voir avec du HTML ou du PHP : ce sont des instructions pour le serveur.
- Elles vont lui expliquer que seules certaines personnes sont autorisées à accéder au dossier. Copiez le code suivant dans votre fichier :
- Parmi ces quatre lignes, vous allez devoir en modifier deux.
- AuthName: c’est le texte qui invitera l’utilisateur a inscrire son login et son mot de passe. Vous pouvez personnaliser ce texte comme bon vous semble.
- AuthUserFile : là c’est plus délicat,il s’agit du chemin absolu vers le fichier .htpasswd (que vous mettrez dans le même répertoire que le fichier .htaccess)
-
Comment trouver ce chemin absolu ?
- En effet, la plupart du temps, cola s’avère délicat Car cela dépend du serveur
- Heureusement, il existe une fonction PHP qui va beaucoup nous aider :
realpath
Cette fonction donne le chemin absolu vers le fichier que vous indiquez. - Vous allez donc faire comme suit pour trouver le chemin absolu.
- Enregistrez le fichier en inscrivant le nom entre guillemets, comme ceci « .htaccess Cela permet de forcer l’éditeur à enregistrer un fichier qui commence par un point.
- Le ficher
.htaccess
est désormais créé, on peut maintenant passer au.htpasswd
-
Créer le
.htpasswd
- Créer maintenant un nouveau fichier avec votre éditeur de texte.
- Le
.htpasswd
va contenir la liste des personnes autorisées à accéder aux pages du dossier. on y inscrit une personne par ligne, sous cette forme: login:mot de_passe_crypté - A la fin, votre fichier
.htpasswd
devrait ressembler à ceci: - Dans cet exemple, il Y a quatre personnes autorisées à accéder au dossier mateo21, ptipilou djfox et vincent.
-
Comment peut-on crypter les mots de passe ?
- Bonne question ! Encore une fois, il y a une super fonction PHP qui va nous tirer d’affaire : crypt . Vous lui donnez un mot de passe et elle vous le crypte (ne cherchez pas à savoir comment).
- 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 votre fichier .htpasswd (quelqu’un qui utilise le même PC que vous, par exemple), il ne verra que le mot de passe crypté. Et là, aucun risque qu’il retrouve votre mot de passe : ce cryptage est indéchiffrable. Il est à sens unique (il s’agit en fait d’une autre forme du hachage que l’on a découvert dans le TP Espace membres).
-
créer un script
-
Description
- Il y a deux parties dans ce code :
- 1. 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 entré, et on affiche $login:$pass_crypte pour que vous n’ayez plus qu’à copier la ligne dans le .htpasswd ;
- 2. SINON, si les variables
$_POST['login']
ou$_POST['pass']
n’existent pas, on affiche donc 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
- Je vous conseille de créer cette page quelque part sur votre disque dur (ou sur votre serveur, peu importe), pour que vous puissiez crypter rapidement vos mots de passe pour le
.htpasswd
. - Si vous avez la flemme de la créer, pas de souci, vous n’avez qu’à vous servir du code web ci-dessus.
-
Envoyer les fichiers sur le serveur
- Vous avez maintenant deux fichiers sur votre disque dur :
.htaccess
et.htpasswd
. - Lancez votre logiciel FTP.
- Transférez les fichiers
.htaccess
et.htpasswd
dans le dossier que vous voulez protéger par un mot de passe. - Vous devriez voir ce qui se trouve à la figure suivante dans votre logiciel FTP.
AuthName "Page d'administration protégée"
AuthType Basic
AuthUserFile "/home/site/www/admini.htpasswd"
Require valid-user
1. Créez un fichier appelé chemin.php
.
2. Inscrivez juste cette ligne de code à l’intérieur : <?php echo realpath('chemin.php'); ?>
3. Envoyez ce fichier sur votre serveur avec votre logiciel FTP, et placez-le dans le dossier que vous voulez protéger.
4. Ouvrez votre navigateur et allez voir ce fichier PHP. Il vous donne le chemin absolu. Par exemple dans mon cas : /home/site/ www/admin/chemin.php
5. Copiez ce chemin dans votre fichier .htaccess
, et remplacez le chemin.php par .htpasswd.
Nous obtenons par exemple au final :/home/site/www/admin/.htpasswd
6. Supprimez le fichier chemin .php de votre serveur, il ne nous sert plus à rien main-tenant qu’il nous a donné le chemin absolu.
mateo21 : $1$MEqT//cb$hAVid.qmmSGFW/wD1IfQ81
ptipilou : $1$/lgP8dYaSsQNXcCP47KhPisneRIZo00
difox:$1$1T7nqnsecVtoPfe0IgrjES7Ushmoy.
vincent:$1Sh4oVHp30$X7Ejpn.uuOhJRkT3qnw3i0
<?php echo crypt('kangourou'); ?>
<?php
if (isset($_POST['login']) AND isset($_POST['pass']))
{
$login = $_POST['login'];
$pass_crypte = crypt($_POST['pass']); // On crypte le mot de passe
echo '<p>Ligne à copier dans le .htpasswd :<br />' . $login . ':' . $pass_crypte . '</p>';
}
else // On n'a pas encore rempli le formulaire
{
?>
<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
}
?>