Aller au menu - Aller au contenu

Icône Protéger un dossier avec un .htaccess

Mise à jour : 03/04/2010
Difficulté : Facile Facile Creative Commons BY-NC-SA
133 390 visites depuis 7 jours, dont 3 444 sur ce chapitre classé 2/786
Lorsque vous réalisez votre site en PHP, vous êtes souvent amenés à 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. :lol:

Supposons que vous ayez créé un dossier "Admin" dans lequel il y a 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 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 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 !
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Créer le .htaccess

La première étape est de créer sur votre disque dur un fichier appelé .htaccess. Oui, c'est un fichier qui n'a pas de nom et qui a seulement une extension, à savoir .htaccess. Ne soyez donc pas étonnés s'il commence par un point.

Ouvrez un nouveau fichier avec votre éditeur de texte favori. Nous allons écrire des codes 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-y ce code :

Code : Apache
1
2
3
4
AuthName "Page d'administration protégée"
AuthType Basic
AuthUserFile "/home/site/www/admin/.htpasswd"
Require valid-user


Parmi ces 4 lignes, il y en a 2 que vous allez devoir changer :

  • AuthName : c'est le texte qui invitera l'utilisateur à inscrire son login / mot de passe. Vous pouvez personnaliser ce texte comme bon vous semble.
  • AuthUserFile : là c'est plus délicat, c'est le chemin absolu vers le fichier .htpasswd (que vous mettrez dans le même répertoire que le .htaccess).

Mais comment je trouve ce chemin absolu moi ?


En effet, c'est la plupart du temps délicat à trouver 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 ceci pour trouver le chemin absolu :

  1. Créez un fichier appelé chemin.php.
  2. Inscrivez juste cette ligne de code à l'intérieur :
    Code : PHP
    1
    <?php echo realpath('chemin.php'); ?>
    
  3. Envoyez ce fichier sur votre serveur avec votre logiciel FTP. 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 .htaccess, et remplacez le chemin.php par .htpasswd, ce qui nous donne au final par exemple :
    /home/site/www/admin/.htpasswd
  6. Supprimez le fichier chemin.php de votre serveur, il ne nous sert plus à rien maintenant qu'il nous a donné le chemin absolu. :)


Si vous êtes hébergés chez Free, il y a une petite subtilité dans la gestion de la localisation du .htpasswd : vous ne devez pas renseigner la ligne AuthUserFile par le chemin absolu du fichier, mais par son chemin relatif à partir de la racine de votre espace perso. Exemple : si vous utilisez un espace Free nommé monftpfree, et que vous placez votre fichier .htpasswd dans un répertoire admin, le fichier chemin.php vous renverra un chemin sous la forme /mnt/XXX/sda/X/X/monftpfree/admin/.htpasswd. Vous devez alors simplement écrire : /monftpfree/admin/.htpasswd. D'autre part, il ne faut pas écrire AuthUserFile mais PerlSetVar AuthFile.


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.

Voilà, on a fini de créer le .htaccess, on peut maintenant passer au .htpasswd ! :)

Créer le .htpasswd

Créez 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 :

Code : Autre
1
login:mot_de_passe_crypté


Au final, votre fichier .htpasswd devrait ressembler à ceci :

Code : Autre
1
2
3
4
mateo21:$1$MEqT//cb$hAVid.qmmSGFW/wDlIfQ81
ptipilou:$1$/lgP8dYa$sQNXcCP47KhP1sneRIZoO0
djfox:$1$lT7nqnsg$cVtoPfe0IgrjES7Ushmoy.
vincent:$1$h4oVHp3O$X7Ejpn.uuOhJRkT3qnw3i0

Dans cet exemple, il y a 4 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, ne cherchez pas à savoir comment, elle vous le crypte. :D

Par exemple, si mon mot de passe est "kangourou", voici le code PHP que je devrai écrire pour l'obtenir en version cryptée :

Code : PHP
1
<?php echo crypt('kangourou'); ?>


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 ne retrouve votre mot de passe : ce cryptage est indéchiffrable. Il est à sens unique.

Bon, on pourrait en théorie s'arrêter là pour le .htpasswd, mais mon âme de codeur PHP me commande de créer un petit script qui va bien vous être utile (non non, ne me remerciez pas, c'est tout naturel !). ;)

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<p>
<?php
if (isset($_POST['login']) AND isset($_POST['pass']))
{
    $login = $_POST['login'];
    $pass_crypte = crypt($_POST['pass']); // On crypte 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 :

  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 rentré, 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'] 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 puisque vous venez d'entrer le login et le mot de passe. Le mot de passe sera alors crypté !


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 le créer, pas de souci, vous n'avez qu'à venir sur cette page et cliquer sur le bouton "Essayer !". ;)

Il y a certains cas où vous ne devrez pas crypter les mots de passe. Sous WAMP ou sur les serveurs de Free.fr par exemple, vous ne DEVEZ PAS crypter vos mots de passe pour que cela fonctionne. Vous devrez donc les écrire directement. Par exemple :
mateo21:kangourou

Envoyer les fichiers sur le serveur

Vous avez maintenant 2 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 mot de passe.
Vous devriez voir ceci dans votre logiciel FTP :


Le contenu du dossier admin vu dans le logiciel FTP


Voilà, désormais le dossier est protégé :)
Si quelqu'un essaie d'accéder à une des pages du dossier (en l'occurence admin.php), il obtiendra une fenêtre comme celle-ci lui demandant de se logger :

Le navigateur demande le mot de passe


Si vous rentrez le bon login avec le bon mot de passe, vous serez alors autorisé à accéder aux pages !
La protection par .htaccess que je viens de vous présenter a l'avantage d'être rapide et simple à mettre en place. Elle vous permet donc de créer une zone Admin en moins de temps qu'il n'en faut pour le dire. :)

Cependant, sur un site un peu plus évolué, vous aurez probablement besoin de limiter les accès à certaines sections du site en fonction du nom du membre ou du groupe auquel il appartient. Là, tout dépend de l'architecture de votre site. En règle générale, un if suffit à déterminer si la page peut être affichée ou non.
Chapitre précédent Sommaire Chapitre suivant

Partager

189 commentaires pour "Protéger un dossier avec un .htaccess"
Note moyenne : 3.61 / 4 (2518 votes)
Pseudo Commentaire
Hors ligne Samoir # Posté le 28/02/2012 à 03:03:53
Qui tente a rien n'a rien !
Avatar

Avis : Très bon

Probleme sa m'affiche sa >"Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, null@easy-hebergement.fr and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log."

HTML5 : llllllllllllllllllll 100%
CSS3 : llllllllllllllllllll 95%
PHP/SQL : llllllllllllllllllll 45%
Javascript : llllllllllllllllllll 5%
Blender : llllllllllllllllllll 10%

A la recherche d'un co-créateur pour un site dédiée au manga MP moi ou contacte moi par skype: samiro282 :D
 
Hors ligne antoine19111996 # Posté le 13/03/2012 à 07:50:33

Avis : Très bon

Bonjours,

Je souhaites juste savoir si on a la possibilité (et si oui comment) de faire des fichier.htpasswd et .htacces pour les membre de notre site,enfin plus précisément pour que les non-membre ne puisse même pas voir la page.

Merci de votre aide

Antoine
Hors ligne arropsy1 # Posté le 18/03/2012 à 16:47:54

Avis : Bon

C'est super sauf que j'ai utiliser le script pour crypter mon mot de passe et il refuse de m'authantifier avec il me fait recommencer comment résoudre ce problème ?

Mister Banlieue Chic
arropsy1
Codeur PHP/MySQL HTML/CSS
 
Hors ligne mauher # Posté le 26/03/2012 à 16:22:41

Avis : Bon

Je viens de m'inscrire sur ce forum après avoir lu ce premier tuto !
Merci pour ce travail clair !

Ma question est de savoir comment modifier le fond de page du navigateur où s'affiche le popup d'identification.
J'aimerais qu'apparaisse en index.htm un aplat de couleur par exemple avec un logo cliquable qui lancerait l'affichage du popup d'identification sur cette même page.
L'entrée du login et password correct, ouvrant une autre page index.

Merci de vos conseils, et désolé si je ne poste pas au bon endroit ! un peu de temps pour me familiariser ...
Hors ligne derba936 # Posté le 11/05/2012 à 13:02:06

Avis : Très bon

Très simple a faire et très clair ! Merci pour ce tuto !
Y a t-il possibilité de y intégrer un bouton déconnexion ????

Voir tous les commentaires