Protéger un site web PHP


Lorsqu'on dispose d'un espace d'hébergement PHP avec nom de domaine chez un hébergeur web (ovh, phpnet...) c'est généralement pour créer un site web destiné à être consulté par les internautes. Cependant, il peut arriver qu'on ait simplement besoin d'utiliser cet espace d'hébergement, en tout ou partie, comme un espace privé dont le contenu serait invisible et inaccessible pour les internautes. La solution la plus simple consiste à placer ses données dans un répertoire créé au dessus du répertoire www. Ce répertoire ne sera pas accessible avec un navigateur web (HTTP) mais seulement avec le logiciel Filezilla ou équivalent (FTP).

Si on souhaite pouvoir accéder aux données avec un navigateur, moyennant la saisie d'un identifiant et d'un mot de passe, il faut mettre en oeuvre une solution plus évoluée. La solution décrite ci-après, répond à ce besoin. Elle a été testée ici en octobre 2020 sur une offre d'hébergement individuel OVH de type Perso. Sa mise en oeuvre peut se décomposer selon les 4 étapes suivantes:

1) Choisir un identifiant et un mot de passe en clair
2) Créer une clef
3) Créer un fichier .htpasswd
4) Créer un fichier .htaccess
5) Vérifier le fonctionnement de la protection

1) Définir un identifiant un mot de passe en clair

On commence par choisir un identifiant et un mot de passe en clair. Dans l'exemple suivant on choisit l'identifiant "ananas" et le mot de passe "toto".

2) Créer une clef

Ensuite on crée une clef qui correspond à un exemplaire crypté du mot de passe choisi. Pour cela on peut utiliser un outil en ligne (il en existe de nombreux disponibles) ou une page de code PHP contenant la fonction PHP crypt(). Le code source php suivant permet de créer une clef correspondant au mot de passe toto.

04

Remarque 1
Si on appelle cette page plusieurs fois de suite, on constate qu'elle retourne une clef différente à chaque fois qu'elle est appelée Cela peut sembler surprenant mais en réalité toutes ces clefs, générées à la volée par l'environnement PHP, sont correctes et n'importe laquelle d'entre elles pourra être utilisée pour protéger le site.

Exemple de clefs (structure de 34 caractères, $1$8caractères$22caractères ) obtenues, avec le code PHP ci-dessus, pour le mot de passe toto
$1$D2Ayb8Oi$mwP6fB2wVscZasELbII/k1
$1$BinGY8.L$7TaJmHDv/Gp6i8yLmvWpm.
...
$1$mczayLHU$ODmP4pB1YImlscNIkXPTf1

Remarque 2
Le code suivant fonctionne également. Avec ce code, on constate que si on appelle cette page plusieurs fois de suite, la clef générée par l'environnement PHP est plus courte et à chaque fois identique. Par exemple : dGBFd1w14G286

05

codes-source.txt

3) Créer un fichier .htpasswd

On crée un fichier texte nommé .htpasswd constitué d'une ligne contenant un identifiant et une clef cryptée correspondant au mot de passe choisi. S'il existe n utilisateurs autorisés à consulter le site, ce fichier contiendra n lignes de la forme identifiant:clef (une ligne par utilisateur)

Remarque
Etant donné que les systèmes d'exploitation des ordinateurs personnels n'aiment pas beaucoup les noms de fichier qui commencent par un point, il est plus simple d'appeler ce fichier simplement htpassw puis de le renommer en .htpasswd seulement une fois qu'il a été placé dans l'espace d'hébergement.

Dans l'exemple choisi (avec un seul utilisateur autorisé), le fichier .htpasswd contiendra donc uniquement la ligne suivante:
ananas:$1$D2Ayb8Oi$mwP6fB2wVscZasELbII/k1

Selon le cryptage utilisé pour créer la clef, on pourra aussi utiliser la ligne suivante ananas:dGBFd1w14G286

On doit ensuite placer ce fichier sur l'espace d'hébergement. Il peut être placé à la racine du site (www), ou dans un répertoire situé au dessus (qu'on nommera MACLEF par exemple)

4) Créer un fichier .htaccess

Là aussi, il est plus simple d'appeler ce fichier simplement htaccess puis de le renommer en .htaccess seulement une fois qu'il a été placé dans l'espace d'hébergement.

A la date d'écriture de ces lignes (octobre 2020), avec un hébergement OVH de type Perso, ce fichier doit contenir les lignes suivantes :
AuthUserFile /home/login_ftp/www/.htpasswd
AuthGroupFile /dev/null
AuthName "Accès Restreint"
AuthType Basic
require valid-user

login_ftp est l'identifiant FTP permettant d'accéder, à l'aide du logicielstrong>Filezilla, à l'espace d'hébergement du site web. Cet identifiant est fourni par OVH lors de l'abonnement.

Remarque 1
La première ligne du fichier .htaccess doit être EnAuthUserFile /home/login_ftp/www/.htpasswd si le fichier htpasswd est placé à la racine du site (dans le répertoire www). En revanche, cette première ligne doit être /home/login_ftp/MACLEF/.htpasswd si le fichier htpasswd n'est pas placé à la racine du site dans dans un répertoire qu'on a nommé MACLEF
AuthUserFile /home/login_ftp/MACLEF/.htpasswd
AuthGroupFile /dev/null
AuthName "Accès Restreint"
AuthType Basic
require valid-use

Remarque 2
Si le fichier .htaccess est placé à la racine du site (www), tout le site est protégé. En revanche, si le fichier .htaccess est placé dans le répertoire www/mon_repertoire, par exemple, alors seul ce repertoire est protégé, les autres répertoires du sites ne sont pas protégés.

02

5) Vérifier le fonctionnement de la protection

Saisir l'adresse du site (mon-site.fr par exemple) dans la barre d'adresse du navigateur. Une boite de dialogue doit apparaître dans laquelle il faut saisir l'identifiant et le mot de passe précédemment définis pour pouvoir accéder au site.

03

6) Complément - Profils utilisateurs

Pour autoriser l'accès à certains répertoires à certains utilisateurs et l'accès à d'autres répertoires à d'autres utilisateurs (notion de profils utilisateurs) on procède de la façon suivante:

1) Dans le fichier .htpasswd (fichier unique pour tout le site), on écrit une ligne par couple "identifiant:mot de passe" de chaque groupe d'utilisateur:
toto:$1$VJIYTi3G$yZtxO1wsMc.ze94UXdw0s1
titi:$1$X105mmMR$J1kfrqe06a0mm6A6.GqOE0
etc...

2) On place, dans chaque répertoire concerné, un fichier .htaccess qui précise les identifiants requis pour pouvoir accéder à ce répertoire.
• Pour autoriser l'accès d'un répertoire à tous les utilisateurs ayant un identifiant valide, on indique "require valid-user" à la fin du fichier htaccess.
AuthUserFile /home/login_FTP/MDP/.htpasswd
AuthGroupFile /dev/null
AuthName "Accès Restreint"
AuthType Basic
require valid-user
• Pour autoriser l'accès d'un répertoire à seulement l'utilisateur toto, on indique "require user toto" à la fin du fichier htaccess.
AuthUserFile /home/login_FTP/MDP/.htpasswd
AuthGroupFile /dev/null
AuthName "Accès Restreint"
AuthType Basic
require user toto

Exemple
Soient :
1) Un fichier htpasswd situé à la racine du site, dans le répertoire MDP, et prenant en compte deux types d'utilisateurs (toto et titi)
toto:$1$VJIYTi3G$yZtxO1wsMc.ze94UXdw0s1
titi:$1$X105mmMR$J1kfrqe06a0mm6A6.GqOE0
2) Un fichier htaccess avec option "require valid-user" placé à la racine du site
3) Un fichier htaccess avec option "require user titi" placé, dans le répertoire SECRET, à la racine du site.
Dans ce cas:
Les utilisateurs qui se connectent avec l'identifiant toto peuvent accéder à tout le site sauf au répertoire SECRET;
Les utilisateurs qui se connectent avec l'identifiant titi peuvent accéder à tout le site y compris au répertoire SECRET.

7) Remarque

L'instruction Options -Indexes que l'on trouve souvent dans le fichier .htaccess placé à la racine d'un site web concerne la configuration du serveur web Apache. Cette instruction spécifique désactive la fonction d'indexation des répertoires.
En effet, lorsqu'on accède à un répertoire sur un serveur web, le serveur peut générer automatiquement une liste des fichiers présents dans ce répertoire si aucun fichier d'index (comme index.html, index.php, etc.) n'est présent.
Cela peut être utile dans certains cas, mais dans d'autres, on peut ne pas vouloir que la liste des fichiers soit accessible publiquement.
En utilisant l'instruction Options -Indexes, on indique au serveur Apache de désactiver la fonction d'indexation des répertoires. Ainsi, si aucun fichier d'index (comme index.html ou index.php) n'est présent, le serveur renverra une erreur 403 (accès interdit) plutôt que de montrer la liste des fichiers.
En résumé, l'instruction Options -Indexes renforce la sécurité en évitant la divulgation involontaire d'informations sur les fichiers présents dans un répertoire lorsque le fichier d'index n'est pas disponible.
En règle générale, la configuration Apache dans le fichier .htaccess est insensible à la casse. Cela signifie que "Options -Indexes" est équivalent à "Options -indexes". La casse des directives, comme dans cet exemple, n'a pas d'importance. Cependant, il est souvent recommandé de suivre les conventions habituelles et d'utiliser la casse standard pour améliorer la lisibilité du code. Dans le cas de la directive Options -Indexes, il est courant de voir la première lettre de "Indexes" en majuscule. Cela facilite la compréhension du code par d'autres personnes qui pourraient le lire.