Serveur Apache HTTP Version 2.4
Utiliser mod_rewrite pour le contrôle d'accès
Ce document est un complément à la documentation de référence de
mod_rewrite
. Il explique comment utiliser
mod_rewrite
pour contrôler l'accès à diverses
ressources, ainsi que d'autres techniques en rapport. Il contient de
nombreux exemples d'utilisation courante de mod_rewrite avec une
description détaillée de leur fonctionnement.
Blocage du référencement à chaud (Hotlinking) d'images
- Description :
-
Cette technique vous permet d'interdire à d'autres sites d'inclure directement vos images dans leurs pages. On fait souvent référence à cette pratique sous le nom de référencement à chaud (Hotlinking) qui entraîne l'utilisation de votre bande passante pour servir des contenus faisant partie du site de quelqu'un d'autre.
- Solution :
-
Cette technique repose sur la valeur de la variable optionnelle
HTTP_REFERER
. Certaines personnes pourront donc contourner cette limitation. Pour la plupart des utilisateurs cependant, la requête échouera, en ce sens que l'image ne sera pas affichée depuis le site tiers.Il y a plusieurs manières de gérer cette situation.
Dans le premier exemple, nous rejetons tout simplement la requête si elle ne provenait pas d'une page appartenant à notre site. Pour les besoins de cet exemple, nous supposons que le nom de votre site est
www.example.com
.RewriteCond "%{HTTP_REFERER}" "!^$" RewriteCond "%{HTTP_REFERER}" "!www.example.com" [NC] RewriteRule "\.(gif|jpg|png)$" "-" [F,NC]
Dans le second exemple, plutôt que de rejeter la requête, nous affichons une autre image à la place.
RewriteCond "%{HTTP_REFERER}" "!^$" RewriteCond "%{HTTP_REFERER}" "!www.example.com" [NC] RewriteRule "\.(gif|jpg|png)$" "/images/go-away.png" [R,NC]
Dans le troisième exemple, nous redirigeons la requête vers une image appartenant à un autre site.
RewriteCond "%{HTTP_REFERER}" "!^$" RewriteCond "%{HTTP_REFERER}" "!www.example.com" [NC] RewriteRule "\.(gif|jpg|png)$" "http://other.example.com/image.gif" [R,NC]
De tous ces exemples, les deux derniers semblent les plus efficaces pour faire en sorte que les gens arrêtent de référencer vos images à chaud, car il ne verront pas les images qu'ils s'attendent à voir.
- Discussion :
-
Si vous ne voulez pas rediriger la requête, mais simplement interdire l'accès à la ressource, vous pouvez y parvenir sans utiliser mod_rewrite :
SetEnvIf Referer "example\.com" localreferer <FilesMatch "\.(jpg|png|gif)$"> Require env localreferer </FilesMatch>
Blocage des robots
- Description :
-
Dans cet exemple, nous allons discuter d'une méthode permettant de bloquer les requêtes persistentes en provenance d'un robot particulier, ou d'un navigateur.
La méthode classique pour exclure un robot consiste à définir un fichier,
/robots.txt
qui spécifie les parties de votre site web pour lesquelles vous voulez exclure les robots. Malheureusement, certains robots ne tiennent pas compte de ces fichiers.Notez qu'il existe des méthodes d'exclusion qui n'utilisent pas mod_rewrite. Notez aussi que toute technique qui repose sur le contenu de la chaîne client
USER_AGENT
peut être contournée très facilement car cette chaîne peut être modifiée. - Solution :
-
On utilise un jeu de règles qui spécifie le répertoire à protéger, ainsi que la chaîne client
USER_AGENT
qui identifie le robot malin ou envahissant.Dans cet exemple, nous bloquons un robot nommé
Vilain_Robot
pour le répertoire/secret/fichiers
. Si vous voulez bloquer ce client seulement depuis une source particulière, vous pouvez aussi spécifier un intervalle d'adresses IP.RewriteCond "%{HTTP_USER_AGENT}" "^NameOfBadRobot" RewriteCond "%{REMOTE_ADDR}" "=123\.45\.67\.[8-9]" RewriteRule "^/secret/files/" "-" [F]
- Discussion :
-
Vous pouvez cependant parvenir au même résultat sans utiliser mod_rewrite via la méthode alternative suivante :
SetEnvIfNoCase User-Agent "^NameOfBadRobot" goaway <Location "/secret/files"> <RequireAll> Require all granted Require not env goaway </RequireAll> </Location>
Comme indiqué plus haut, il est aisé de contourner cette technique, simplement en modifiant le contenu de l'en-tête
USER_AGENT
. Si vous subissez une attaque en règle, vous allez devoir réfléchir à un blocage à un niveau supérieur, par exemple une règle de filtrage de votre pare-feu.
Rejet des clients contenus dans une liste noire
- Description :
-
Nous voulons interdire l'accès à notre serveur aux clients contenus dans une liste noire similaire à
hosts.deny
. - Solution :
-
RewriteEngine on RewriteMap hosts-deny "txt:/path/to/hosts.deny" RewriteCond "${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND}" "!=NOT-FOUND" [OR] RewriteCond "${hosts-deny:%{REMOTE_HOST}|NOT-FOUND}" "!=NOT-FOUND" RewriteRule "^" "-" [F]
##
## hosts.deny
##
## ATTENTION! Ceci est une table de correspondances, non une liste,
## même si elle est traitée comme telle. mod_rewrite
## l'interprète comme une liste de paires clé/valeur, et
## chaque entrée doit au moins posséder une valeur par
## défaut "-".
193.102.180.41 -
bsdti1.sdm.de -
192.76.162.40 -
- Discussion :
-
La seconde condition RewriteCond présuppose que HostNameLookups est défini à On, de façon à ce que les adresses IP des clients puissent être résolues. Dans le cas contraire, vous devez supprimer la seconde condition, ainsi que le drapeau
[OR]
de la première.
Aiguillage basé sur l'en-tête Referer
- Description :
-
Redirige les requêtes en fonction du Referer de provenance de la requête, avec des cibles différentes pour chaque Referer.
- Solution :
-
Le jeu de règles suivant utilise un fichier de correspondances pour associer chaque Referer à une cible de redirection.
RewriteMap deflector "txt:/path/to/deflector.map" RewriteCond "%{HTTP_REFERER}" !="" RewriteCond "${deflector:%{HTTP_REFERER}}" "=-" RewriteRule "^" "%{HTTP_REFERER}" [R,L] RewriteCond "%{HTTP_REFERER}" !="" RewriteCond "${deflector:%{HTTP_REFERER}|NOT-FOUND}" "!=NOT-FOUND" RewriteRule "^" "${deflector:%{HTTP_REFERER}}" [R,L]
Le fichier de correspondances contient les cibles de redirection associées à chaque Referer, ou, si nous voulons simplement rediriger les requêtes vers leur Referer, un "-" est inscrit dans le fichier de correspondances :
## ## deflector.map ## http://badguys.example.com/bad/index.html - http://badguys.example.com/bad/index2.html - http://badguys.example.com/bad/index3.html http://somewhere.example.com/