Pas Tout A Fait

Aller au contenu | Aller au menu | Aller à la recherche

Empêcher le hotlinking

Dernière mise à jour le 05 septembre 2011

Dans la catégorie "les plaies du web", on trouve le hotlinking. Cette pratique consiste à afficher un élément, le plus souvent une image, sur un site, blog ou forum en utilisant directement l'adresse URL originale de l'image, sans prendre la peine d'héberger l'image sur son propre serveur. Il s'agit ni plus ni moins d'un vol de temps de calcul et de bande passante...

Il est heureusement assez simple supprimer la majorité des hotlinks polluants un serveur, en interdisant l'affichage d'images hébergées par nos soins ailleurs que sur son site. Ce blocage se réalise en jouant avec le mod_rewrite d'Apache, manipulable via le fichier .htaccess, ou directement dans la configuration d'Apache, si vous avez la main dessus. Seul l'exemple du .htaccess sera abordé ici, puisqu'il s'agit souvent de l'unique possibilité de configuration.

symb-stop-mod.jpg


Bloquer complètement l'affichage

La technique la plus simple à mettre en œuvre consiste à bloquer l'affichage des images via une erreur 403 d'interdiction. Pour cela le fichier .htaccess doit contenir les lignes suivantes :

# Interdir les hotlinks
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?votresite.tld/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://(www\.)?uneautresite.tld/.*$ [NC]
RewriteRule \.(gif|GIF|jpg|JPG|jpeg|JPEG|png|bmp|BMP)$ - [F]

Ici toutes les requêtes vers les fichiers se terminant par .gif, .jpg, etc seront interdites, via une erreur 403, sauf celles provenant de http://www.votresite.tld et http://www.unautresite.tld. C'est une méthode radical et économique en bande passante.


Envoyer une autre image

Une technique plus amusante consiste à afficher une autre image que celle victime d'un hotlink. Image qui contiendra par exemple l'url de votre site en gros caractères. :-)

# Remplacer les hotlinks
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?votresite.tld/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://(www\.)?unautresite.tld/.*$ [NC]
RewriteRule \.(gif|GIF|jpg|JPG|bmp|BMP|jpeg|JPEG|png|PNG)$ http://pastoutafait.org/hotlinks.jpe [L,R]

Faites en sorte, à moins de disposer d'un serveur particulièrement performant, de choisir une image d'un poids réduit. Consultez ce billet pour réduire les jpg ou png. Libre à vous néanmoins de laisser le message de votre choix dans cette image...


Un peu plus bourrin

Une méthode un peu brutale consiste à afficher sur les pages faisant du holinking un message de type "Authentification requise". Elle s'emploie en redirigeant non plus vers une interdiction ou une image alternative, mais vers un fichier contenant par exemple le code suivant :

<?php
  header('WWW-Authenticate: Basic realm="Le hotlinking c'est mal !"');
  header('HTTP/1.0 401 Unauthorized');
?>

hotlink-ait.png

Cette méthode est particulièrement pénible pour l'usager du site qui hotlink, mais demande un minimum d'attention, en particulier si de nombreuses images de votre site son "hotlinkées" sur des forums. Veillez à bien poser des conditions corrects pour ne pas mettre ce message d'authentification sur trop de pages externes, en repérant bien les sites qui hotlink vos images massivement ou qui copie/colle vos articles. Étudier les fichiers de logs ou les résultats d'un analyseur comme AwStats permet de trouver ces sites.

Voici les lignes à mettre dans votre .htaccess :

# Remplacer les hotlinks
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?votresite.tld/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://(www\.)?unautresite.tld/.*$ [NC]
RewriteRule \.(gif|GIF|jpg|JPG|bmp|BMP|jpeg|JPEG|png|PNG)$ http://pastoutafait.org/hl.php [L,R]

Les autres types de fichiers

Il est bien évidemment possible de bloquer l'accès à d'autres types de fichiers en indiquant leurs extensions.

RewriteRule .*\.(zip|avi|wmv|mpeg|mpg|mov|flv||rar|exe|mp3|swf|wma)$ http://pastoutafait.org/tarbomb.tgz [R,L]

Du hotlink sur des fichiers un peu lourds peut mettre à mal votre quota de bande passante pour peu que le site à l'origine de ces hotlinks soit bien fréquenté.


Comment ça marche ?

Le mod_rewrite d'Apache est monstrueux et permet toutes sortes de fantaisies. Au-delà de la simple réécriture d'adresse pour faire jolie, déjà bien utilisée sur ce site, il permet grâce à une combinaison de conditions et de règles d'affiner en profondeur la gestion des requêtes envoyées sur un serveur.

Voici une brève explication des lignes présentes dans le .htaccess :

<IfModule mod_rewrite.c>

Pas obligatoire sur tout les serveurs, il s'agit de vérifier la présence de mod_rewrite sur celui-ci, et de passer l'exécution des lignes suivantes en cas d'absence du module.

RewriteEngine On

Cette ligne parle d'elle même, il s'agit d'activer le moteur de réécriture.

RewriteCond %{HTTP_REFERER} !^$

Cette ligne indique que les HTTP_REFERER vident ont accès aux fichiers. La variable HTTP_REFERER permet d'identifier l'URL à l'origine de la requête.

RewriteCond %{HTTP_REFERER} !^http://(www\.)?votresite.tld/.*$ [NC]

Cette ligne permet de ne pas appliquer la réécriture aux requêtes provenant de votre site. Indispensable sous peine de ne plus voir les images sur vos propres pages. Il est bien sûr possible d'indiquer plusieurs sites, pour permettre l'affichage sur les sites autorisés. La règle "une site/une ligne" s'applique.

RewriteRule \.(gif|GIF|jpg|JPG|jpeg|JPEG|png|bmp|BMP)$ - [F]

C'est la règle. Dans cette exemple une interdiction symbolisée par ce [F].

La documentation technique de mod_rewrite est disponible sur le site d'Apache en anglais ou en français. Vous y trouverez tous les détails utiles. La signification des lettres entre crochets (NC, R, F, etc) est résumée sur une page dédiée de la documentation Apache.


Limite de ces méthodes

Les méthodes ci-dessus ne sont pas infaillibles.
Une personne capable de modifier son "HTTP_REFERER" pourra contourner vos règles et continuer à afficher les images de votre site sur le sien via votre serveur.

Cependant, mettre en place une modification du "HTTP_REFERER" est un peu lourd, et représente bien plus de travail que de simplement héberger les images sur son propre site ou sur un hébergeur spécialisé, comme ImageShack ou Hiboox. Donc la plus part du temps, le hotlinker va simplement retirer les images ou les héberger lui même pour ne pas trop se prendre la tête.


Comment réagir face au hotlinking ?
  • Assez souvent, les hotlinks ne représenteront qu'une part infime de votre consommation de bande passante. Dans ce cas, mettre en place une interdiction complète n'est pas forcement toujours très pertinent.
  • Un simple message au responsable d'un site qui hotlink vos images peut parfois suffire. De nombreux hotlinks sont réalisés sans même avoir conscience de la pénibilité de cette pratique. Alors un gentil mail expliquant en quoi le hotlink est pénible et demandant de retirer les images qui posent problèmes est déjà une première bonne façon de réagir et de régler le problème "diplomatiquement".
  • Dans le cadre du remplacement des hotlinks par une autre image, il est évidemment possible de faire dans la finesse ou dans le gros boulet... Tout dépend de votre choix concernant l'image de remplacement.
  • En cas de copier/coller complet d'articles, il peut être utile de mettre en place temporairement des règles pénibles pour inciter l'auteur du site à l'origine du plagiat à retirer/héberger les images et à indiquer l'origine du texte.
Matthieu Patout

Auteur: Matthieu Patout

Restez au courant de l'actualité et abonnez-vous au Flux RSS

BG BG ·  08 septembre 2009, 22:59

Intéressant cet article, merci ! ;)

Demio Demio ·  14 octobre 2009, 09:24

Bravo pour cet article, il dépanne bien!

Merci !

Thibs Thibs ·  09 décembre 2009, 12:45

Petite variante pour afficher le header 401 juste pour un fichier image spécifique :

Dans le .htaccess

RewriteEngine On
RewriteRule ^CHEMIN_FICHIER_IMAGE/NOM_FICHIER_IMAGE$ /hotlinking.php [L]

Et à la racine le fichier hotlinking.php

(Dans mon cas c’est parce que mes images sont prises par une multitude de sites de téléchargement illégaux … ;-)

Matthieu Patout Matthieu Patout ·  10 décembre 2009, 11:20

@Thibs : C'est également valable pour les autres types de remplacements, par exemple :

RewriteRule ^CHEMIN_FICHIER_IMAGE/NOM_FICHIER_IMAGE$ http://pastoutafait.org/hotlinks.jpe L,R

affiche "hotlinks.jpe" juste en remplacement de l'image dont le chemin est indiqué.

Merci de l'astuce.

Franck C. Franck C. ·  13 décembre 2011, 07:01

Merci pour l'astuce.

Comme dans un des commentaires ci-dessus, je commence à avoir pas mal d'images utilisées pour des sites de DL ou de streaming, donc j'ai décidé de mettre une image de substitution.

Le problème, c'est qu'elle ne s'affiche pas sur les sites qui "hotlinkent", au lieu de ça il y a l'url de l'image hotlinkée... (mais quand on clique sur ladite url, on est redirigé vers l'url de l'image de substitution, avec un message "Firefox ne peut trouver le serveur à l'adresse www.indawave").

Est-ce que vous avez une idée du problème ?

En tous les cas, blog très intéressant, j'y reviendrai !

Ajouter un commentaire Fil des commentaires de ce billet

aucune annexe



Voir Aussi

zen-coding-logo.png

Activer ZenCoding dans Geany sous Debian Squeeze

Zen Coding est une extension existante pour les principaux éditeurs de textes et IDE, qui vise à...

Lire la suite

awstats_logo4.png

Installation et configuration de AwStats sur Debian Squeeze

AWStats est un analyseur de log web, ftp et mail, écrit en Perl et disponible sous licence GPL. Il...

Lire la suite


Découvrez le Nouveau « Pack Liberté »