Mis à jour le mercredi 8 mars 2017
  • 4 heures
  • Facile

Protégez vos répertoires

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Ce chapitre sera relativement court, dans la mesure où je ne pourrais pas vous apporter beaucoup d'informations supplémentaires que dans le cours sur le PHP. Je vais donc me contenter de vous sensibiliser à l'importance de contrôler ses répertoires, et vous donner deux-trois astuces qui peuvent se révéler bien pratiques. ;)

La clause <limit>, la faille du .htaccess

Il est important de garder à l'esprit qu'un site est simplement constitué de dossiers et de sous-dossiers, organisés avec une architecture bien précise. Le fait est que rien n'empêche un utilisateur de se balader à travers les répertoires. La plupart du temps, cela ne posera pas de problème. C'est le fonctionnement même d'un site web !

Mais il est parfois intéressant de restreindre l'accès à certaines parties du site, par exemple à la zone admin ou encore à certains dossiers. Même si vous n'avez à priori rien de très important dans ces répertoires, ne laissez pas les utilisateurs y traîner s'ils n'ont rien de particulier à y faire.

La méthode la plus courante et la plus propre est d'utiliser un .htaccess avec des règles suffisamment strictes et adaptées à vos répertoires. Cependant, les .htaccess ne sont pas épargnés par les failles !

Par exemple, voilà un classique que l'on retrouve encore dans beaucoup trop de sites actuels :

AuthName "Admin"    
AuthUserFile /home/www/admin/.htpasswd  
AuthGroupFile /dev/null                       
AuthType Basic                                
  
<Limit GET POST>  
    require valid-user  
</Limit>  

Ce procédé utilise la clause<limit> pour vérifier l'authenticité de l'utilisateur. Le problème, c'est que cette méthode ignore toutes les requêtes qui utilisent une méthode différente de POST. Si j'essaye de me connecter avec une méthode qui n'existe pas comme UNKNOWN, HACK, LAVEVAISSELLE ou encore RUBIKSCUBE, elle ne se sentira pas concernée et me laissera passer sans broncher. Un trou béant dans la sécurité de votre site !

Le code correct est le suivant :

AuthName "Admin"    
AuthUserFile /home/www/admin/.htpasswd  
AuthGroupFile /dev/null                       
AuthType Basic 
require valid-user 

Oui, oui, il suffit juste d'enlever la clause<limit>. Je ne sais pas pourquoi, certains s'acharnent à l'utiliser quand même. Ne faites pas les même erreurs, prenez de bonne habitudes ! ;)

Modifier la méthode utilisée pour communiquer avec le serveur

Pour ceux qui souhaiteraient tester la solidité de leur .htaccess face à ce problème de méthode POST, il est très facile de modifier la méthode utilisée pour communiquer avec le serveur.

Utilisateurs Linux

Vous êtes les plus avantagés, Linux a été conçu pour ce genre de choses. Nous allons ici utiliser libcurl, une librairie conçue pour communiquer facilement avec un serveur grâce à une foultitude de protocoles. Normalement, elle est installée par défaut sur la plupart des distributions. Si vous ne l'avez pas, une simple recherche Google "installer libcurl [votre distribution]" devrait vous orienter rapidement sur la façon la plus rapide de l'installer.

Une fois la librairie en place, il ne nous reste plus qu'à nous connecter à l'hôte avec notre fameuse méthode inconnue :

curl -X UNKNOWN --url http://monsite.fr/admin/admin.php

Pour les utilisateurs Windows/Mac

Pour les utilisateurs sous Windows ou OS X, il existe plusieurs solutions.

  • Vous pouvez vous amuser à créer un fichier PHP qui utilise la fonction curl pour se connecter à l'hôte, en prenant bien soin de modifier la méthode utilisée.

  • Vous pouvez également installer des modules complémentaires sur vos navigateurs préférés pour modifier les en-têtes HTTP lors de la connexion. Je ne peux pas vous donner le nom d'une extension pour tous les navigateurs, mais tapez "live HTTP headers" sur votre moteur de recherche préféré et je vous assure que vous trouverez votre bonheur !

Il existe bien sûr d'autres solutions, mais celles-ci sont les plus commodes et je n'ai pas le temps de toutes les détailler ici.

  

Maintenant, quelle que soit votre distribution, il y a deux cas possibles. Si ça loupe lamentablement, votre .htaccess n'est pas sensible aux méthodes exotiques, donc il est protégé de ce type de bypass. En revanche, si du code HTML de votre fichier admin.php s’affiche, posez-vous sérieusement des questions sur la fiabilité de votre sécurisation…

Interdire aux utilisateurs d'accéder aux répertoires

Il existe un moyen d'interdire l'accès à un répertoire avec le .htaccess, sans passer par un mot de passe. Il suffit de créer un fichier .htaccess de la sorte (voir ci-dessous) et de le placer dans le répertoire que vous souhaitez protéger.

deny from all

Petite astuce pour ceux qui ne souhaiteraient pas (pour une raison ou une autre) créer de .htaccess, mais interdire quand même aux utilisateurs de se balader dans les répertoires.

Il vous suffit de créer un fichier "index.php" avec à l’intérieur une redirection 301, et de le placer dans chacun des répertoires que vous souhaitez rendre inaccessibles.

<?php

// Soit vous faites une redirection vers le répertoire précédent
// qui redirigera lui-même vers le précédent jusqu'à trouver une
// page autorisée

header("location:../");
exit();

// Soit vous redirigez directement vers une page en particulier

header('location: http://www.monsite.fr/index.php')
exit();

?>

Voilà, vous en savez un peu plus sur les répertoires et comment empêcher n'importe qui de s'y balader sans contrainte. 

Exemple de certificat de réussite
Exemple de certificat de réussite