Serveur HTTP Apache Version 2.4
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.
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.
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.
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>
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.
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]
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.
Nous voulons interdire l'accès à notre serveur aux clients
contenus dans une liste noire similaire à
hosts.deny
.
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 -
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.
Redirige les requêtes en fonction du Referer de provenance de la requête, avec des cibles différentes pour chaque Referer.
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/