HotLink : Protéger vos images sous WordPress.

Dans ce tutoriel, nous verrons comment lutter contre le hotlink de vos images sous wordpress. Mais avant de commencer une petite définition s’impose :
Le hotlink est une pratique de plus en plus répandu, et pourtant illégale. On la retrouve notamment dans les forums.

Mais qu’est ce que c’est ?

Tout d’abord expliquons que chaque site a un espace où il stocke ses images. Chaque fois qu’une de ses images est affichée quelque part cela a une incidence sur ce qu’on appelle sa bande passante.
Le hotlink est l’affichage d’une image en la prenant directement à la source du site qui la propose.
Au lieu d’enregistrer l’image sur son ordinateur  la personne se servira de l’url de cette image afin de l’afficher sur son forum, blog.

Quelles sont les incidences de cette pratique ?

Tout d’abord cela ralentit le site hotlinké ensuite pour les nombreux sites payant leur bande passante cela a un coût financier puisqu’à chaque fois que l’image va s’afficher sur un site ou sur une communauté ou sur un autre site, cela sera financièrement comptabilisé chez le site qui stocke cette image, cela a d’ailleurs déjà entrainé de nombreuses fermetures de sites ne pouvant plus assurer financièrement, merci aux hotlinkeurs !

Comment se rendre compte qu’une image est hotlinkée ?

Simplement en se plaçant dessus, en faisant un clic droit avec sa souris, puis propriétés, là s’affiche l’url de l’image, si l’url correspond au site sur lequel vous êtes il n’y a pas de problème, si l’url indique un autre site cette image est hotlinkée.

Pourquoi les gens utilisent le hotlink ?

Pour les communautés cela leur permet d’économiser leur espace de stockage réduit et donc de ne pas payer pour en avoir plus.
Pour les forums cela permet d’afficher des images, puisque seules les images provenant du net, donc ayant un url peuvent s’afficher.

Quelles solutions ?

Nous allons voir une solution à l’aide du fichier .htaccess et le module Mod_rewrite ou la réécriture des URL « à la volée » d’apache.

Voici un exemple de mon fichier .htaccess : (les instructions en gras concerne la mise en place de notre système de protection contre les hotlink).

Hotlink_1

Pour ce faire, j’ai mis en place une règle Apache pour changer à la volée mes images utilisées sur des sites non autorisés. Dans le fichier .htaccess de mon blog, j’ai ajouté des conditions pour pouvoir utiliser mes images:

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https://quick-tutoriel.com/.*$      [NC]
RewriteCond %{HTTP_REFERER} !^https://quick-tutoriel.com$      [NC]
RewriteRule .*\.(jpg|jpeg|gif|png|bmp)$ https://quick-tutoriel.com/images/image_unauthorized_access.png [R,NC]

Toutes les images utilisées en dehors du domaine quick-tutoriel.com et de ses sous domaines sont remplacées par une image explicite:

Hotlink_2

Pour ne pas bloquer les lectures depuis les lecteurs RSS courants comme FeedBurner, Google Reader, Netvibes et Wikio, j’ai ensuite ajouté de nouvelles conditions :

RewriteCond %{HTTP_REFERER} !^http://feeds2.feedburner.com/Quick-tutoriel/.*$      [NC]
RewriteCond %{HTTP_REFERER} !^http://feeds2.feedburner.com/Quick-tutoriel$      [NC]
RewriteCond %{HTTP_REFERER} !^http://www.google.com/reader/.*$      [NC]
RewriteCond %{HTTP_REFERER} !^http://www.google.com/reader$      [NC]
RewriteCond %{HTTP_REFERER} !^http://www.netvibes.com/.*$      [NC]
RewriteCond %{HTTP_REFERER} !^http://www.netvibes.com$      [NC]
RewriteCond %{HTTP_REFERER} !^http://images.google.fr/.*$      [NC]
RewriteCond %{HTTP_REFERER} !^http://images.google.fr$      [NC]
RewriteCond %{HTTP_REFERER} !^http://images.google.com/.*$      [NC]
RewriteCond %{HTTP_REFERER} !^http://images.google.com$      [NC]

Si vous ne rajouter pas ces conditions voici ce qui peut se passer lorsqu’un internaute consulte ses flux RSS depuis google reader par exemple :

Hotlink_3

Voila, si vous êtes confronté au même problème, il vous suffit de changer quick-tutoriel.com par votre nom de domaine et de coller le tout dans le fichier .htaccess à la racine de votre site.

Attention!!! En fonction des hébergeurs des règles spécifiques peuvent apparaître dans la gestion du fichier .htaccess ou des chemins relatifs ou absolu, …..

Il est utile de préciser que certains hébergeurs n’ont pas activé le module de réécriture (mod_rewrite). Dans ce cas, vous n’avez malheureusement aucune possibilité de l’utiliser, à moins de casser le petit cochon en porcelaine qui traîne chez vous et changer d’hébergeur.

Maintenant, essayons d’expliquer ce que sont les réécritures conditionnelles :

Nous allons ici détailler la réécriture sous conditions à travers quelques exemples concrets.

  • Une page d’accueil différente selon le navigateur
RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla.*
RewriteRule  ^/$    /complexe.html  [L]
RewriteCond  %{HTTP_USER_AGENT}  ^Lynx.*
RewriteRule  ^/$    /simple.html  [L]
RewriteRule  ^/$    /standard.html  [L]

Un nouveau mot-clé fait son apparition ici : « RewriteCond » ou « condition de réécriture ».

La syntaxe est simple et de la forme : RewriteCond variable_testée valeur_de_comparaison

Dans l’exemple, testons si l’identifiant du navigateur (%{HTTP_USER_AGENT}) commence par Mozilla (^Mozilla) et est suivi par une chaîne quelconque. (.*)

Si cette règle est vraie, nous réécrivons le répertoire racine du site(^/$ signifie « début de ligne/fin de ligne » ou simplement / seul sur la ligne)) en page « complexe.html » et arrêtons nos réécritures [L] .
Procédons de même pour Lynx, qui se satisfera d’une page simple vu ses fonctionnalités réduites et enfin, si aucune des 2 règles précédentes ne s’applique, soit pour tous les autres navigateurs, redirigeons les vers notre page « standard.html ».

  • Protégeons nos fichiers images

Évitons maintenant que d’autres sites ne fassent un lien direct vers nos images, en nous détournant de la bande passante:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://www.votredomaine.net/.*$ [NC]
RewriteRule .*\.(jpg|jpeg|gif|png|bmp)$  [R,NC]

En mettant plusieurs conditions à la suite, un ET logique est effectué entre elles. Pour que la règle de réécriture soit effectuée, il faut donc que toutes les conditions soient vraies prises isolément. A la première condition FAUSSE, le moteur de réécriture branche directement après la règle et ne teste pas les conditions suivantes. Si un OU logique est nécessaire, on rajoute le drapeau [OR] en fin de ligne, en le combinant aux autres le cas échéant [NC,OR]

Dans notre exemple, on compare la variable HTTP_REFERER au domaine du site.

Les conditions s’énonceraient en clair « Si la variable HTTP_REFERER n’est pas vide et n’est pas égale au nom de domaine http://www.votredomaine.net/ suivi de n’importe quelle chaîne de caractères (même vide) en faisant abstraction de la casse [NC], alors… »

Notez que le point d’exclamation (!), inverse le test et signifie donc «n’est pas». Changez aussi le nom de domaine pour qu’il corresponde au vôtre.

La dernière règle donne comme instruction de remplacer les images jpg, jpeg, gif, … par une image unique, généralement un message d’avertissement.

Un commentaire toutefois : Certains navigateurs permettent de masquer le HTTP_REFERER, et certains proxy ou firewall ne transmettent pas cette référence.
C’est la raison pour laquelle nous avons la première condition testant si HTTP_REFERER n’est pas vide(RewriteCond %{HTTP_REFERER} !^$). Sans cette règle, les visiteurs derrière certains firewall ou proxy ne verraient pas vos images.

Cette dernière limitation démontre bien qu’il n’est pas possible d’éliminer 100% des liens sauvages vers vos images puisqu’il suffit de masquer le HTTP_REFERER pour éviter l’interdiction. Une élimination de 95-98% des liens représente déjà une économie substantielle de bande passante.

Si vous souhaitez autoriser certains domaines amis à faire des liens directs, il suffit d’ajouter pour chacun d’eux une condition supplémentaire :

RewriteCond %{HTTP_REFERER} !^http://votredomaine.net/.*$ [NC]

Cet exemple permet d’accéder aux images dans le cas où votre domaine serait invoqué sans le sous-domaine « www ».

  • Quelques expressions régulières à connaître :
. n’importe quel caractère
[abcd] n’importe lequel de cette liste de caractères
[^abcd] tout caractère non compris dans la liste (autre que a, b, c ou d)
blanc|noir alternative, soit « blanc », soit « noir »
+ Une ou N occurrence(s) de l’expression qui précède (N > 1)
* Zéro ou N occurrence(s) de l’expression qui précède (N>0)
(texte) Groupement permettant l’utilisation des références inverses ($1,… $n) Est aussi utilisé pour délimiter une alternative comme dans (blanc|noir)  et ancre de début de ligne
$ ancre de fin de ligne
\ permet d’échapper tout caractère qui suit et lui ôter sa signification par exemple \.
  • Quelques drapeaux (ou flags) utiles.

Voici quelques drapeaux utiles pour faciliter la maintenance d’un site :

[L] Lorsque le module de réécriture est actif, les règles sont lues séquentiellement et l’URL est comparée ligne à ligne avec le premier argument de celles-ci jusqu’à la dernière.
Si une réécriture est effectuée, c’est la forme réécrite qui sera utilisée en entrée pour les règles suivantes.
Le flag [L] permet de sortir prématurément de la boucle.
Un autre exemple serait, en début d’une liste de règles :
RewriteRule ^.*\.gif$  –  [L] RewriteRule ^.*\.jpg$  –  [L]Nous introduisons ici un nouveau concept, à savoir un second argument vide (ou presque, car il consiste en un seul caractère « – » ) . Cette règle particulière implique qu’il n’y a pas de réécriture, l’URL étant passée sans modification aucune. Elle signale au serveur Apache de passer toutes les URL d’images gif ou jpg sans réécriture, ni traitement successif.
[R]
[R=code]
Dans ces deux formes une redirection est effectuée.
Si l’argument code n’est pas précisé, une redirection 302 (déplacé temporairement) est effectuée. Si vous souhaitez faire savoir au navigateur/robot qu’une page a été remplacée définitivement, utiliser le code 301 comme dans :
RewriteRule ^ancien\.html$ [R=301,L] Dans ce cas précis, une réécriture « externe » s’impose (utilisation de http://…)Vous voyez ci-dessus que nous avons combiné deux flags en les séparant par une virgule.
[F] Forbidden – interdit. Retourne un code 403, par exemple :
RewriteRule ^secret.html$ – [F] ( pas de réécriture vu le deuxième argument – )
[NC] NoCase, ou « insensible à la casse ». La règle suivante :
RewriteRule  ^script\.php$  programme.php  [NC,L] S’appliquera aussi bien à script .php, SCRIPT.PHP ou ScRiPt .PhP
[G] Gone. Cette page n’existe plus et retourne une entête http 410
[N] Force l’analyse et l’exécution de toutes les règles en repartant du début de la liste. Ici encore, comme expliqué plus haut ([L]), c’est l’URL modifiée après exécution de la dernière règle qui est utilisée en entrée, et non l’URL originelle. Attention aux boucles infinies !!
[C] Chain, chaînage avec la ou les règles suivantes jusqu’à la première règle ne se terminant pas par [C] Apache interprète ce flag comme suit : s’il y a réécriture (la règle est vérifiée), la règle suivante est exécutée avec la chaîne réécrite en entrée.
Si la règle ne se vérifie pas, toutes les règles qui suivent jusqu’à la première ne comportant pas le flag [C] ne sont pas appliquées.
[QSA] Query String Append. Rajoute le QUERY_STRING à la fin de l’expression, après la réécriture. A réserver pour la dernière règle de réécriture. Utilisée le plus souvent avec le flag [L], comme dans [QSA,L]

Cette liste n’est pas exhaustive, car il existe d’autres flags supportés. La liste complète est décrite dans la documentation du module mod_rewrite sur le site d’Apache.

Enfin si vous voulez savoir si votre protection hotlink fonctionne, vous pouvez aller sur ces sites ( ici ou ici ) et mettre le chemin de votre image et voir le résultat. Exemple avec le site http://www.htaccesstools.com/

Hotlink_4

Après avoir mis le chemin de votre image, cliquer sur Test Hotlink Protection

Hotlink_5

Si vous avez ce résultat, votre protection marche, sinon l’image apparaitra.

Beaucoup d’hébergeur digne de ce nom vous propose une interface graphique pour éviter de mettre les mains dans le cambouis, si vous n’êtes  pas très à l’aise dans ces manipulations je ne peux que vous le conseiller.

Mon hébergeur utilise Cpanel pour la gestion de mon hébergement, pour clore ce dossier je vais vous montrez comment paramétrer la protection contre le hotlink depuis Cpanel.

Connectez-vous sur votre console d’administration.

Hotlink_6

Vous devez arriver sur une page similaire, ensuite déplacez-vous à la section Sécurité

Hotlink_7

Ensuite cliquer sur Protection des liens actifs.

Hotlink_8

1 : Cliquer sur le bouton  pour activer / désactiver la fonction de protection
2 : Saisir les URL des sites qui droit d’accéder à vos images
3: Saisir les extensions de vos images à surveiller
4: Saisir l’url de redirection vers une image de rappel à l’ordre puis cliquer sur le bouton soumettre pour enregistrer les modifications

Si vous rencontrez des problèmes avec votre lecteur, faites le moi savoir par le formulaire de contact ici, pour que je corrige le problème.

That’s All.

7 Potins

  1. merci pour l’info mais je viens de tester sur mon site et cela ne fonctionne pas… est-ce parce que j’ai un plugin de cache ?

  2. Mouais bof, demande de faire ça à des kikoolol t’es pas là de les avoir tes liens, le pire c’est quand on te prend ton texte + tes images tu n’as pas besoin d’essayer de faire la discute avec des gens comme ça ou alors t’as du temps à perdre.

    Moi je les laisse voler et après j’leur mets une image porno, après ça ils sont vacciner. La méthode est radicale tout comme leur vaccination :-)

  3. Bonjour,

    J’ai lu votre intéressant tutoriel. J’aimerai juste vous communiquer une autre vision de la réponse à apporté aux hotlinks que j’ai rencontré sur le site VisoHotlink.fr :

    « (…) il est assez facile de tirer profit du hotlink pour augmenter l’audience de ses sites et leur référencement. Prenons un exemple simple : un blogger utilise l’une de vos images dans son dernier article. Si vous pouviez détecter cette utilisation, vous pourriez très bien le contacter pour qu’il cite sa source, c’est à dire qu’il fasse un lien vers votre site. Vous gagner ainsi un backlink, qui plus est, le plus souvent ciblé, avec tous les avantages que celà induit au niveau audience et référencement pour votre site!

    Plutôt que d’interdire systématiquement le hotlink avec des protections classiques ( via .htaccess notamment), une approche plus souple au cas par cas semble être plus bénéfique. Au delà, vous pourriez même inciter vos visiteurs à hotlinker vos images pour récupérer des backlinks (en leur fournissant un code html ou BBCode à utliliser pour afficher vos images sur leur site par exemple) ! »

    Je ne suis pas le promoteur du site, j’ai juste trouvé son analyse attrayante.

    Bonne continuation.

  4. Merci pour cet excellent tutorial, complet, clair. Je vais suivre tes instructions, aujourd’hui

  5. J’ai testé plusieurs solutions que je pensais bonnes. Finalement je vais tester le code que tu donnes. Merci d’avoir expliqué les significations des codes car j’avais du mal à interpréter les règles.
    Les nouvelles conditions pour lecteurs RSS doivent-elles être ajoutées avant la RewriteRule qui redirige vers l’image ?
    J’aimerais voir la version finale intégrale du code avec les lignes pour flux RSS, afin de voir les emplacements des lignes dans l’ensemble.

  6. Merci, ton lien complète parfaitement le tutoriel.

    A bientôt sur Quick-Tutoriel.com, Le Webmaster.

  7. Bonjour,

    Pour WordPress, il y a plus simple, le plugin décrit ici :

    Pour les autres, excellent tutoriel.

    Hervé

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *