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