9 votes

Comment empêcher les liens chauds ("vol d'image" / "vol de bande passante") de ressources sur mon site ?

J'essaie d'écrire le "nec plus ultra" de l'anti hot linking .htaccess...

Vous pouvez trouver de nombreux exemples/tutoriels / générateurs sur le net mais beaucoup d'entre elles sont erronées ou incomplètes (voire les deux).

Ce sont les caractéristiques que je recherche :

  • Doit bloquer la liaison à chaud pour une liste d'extensions de fichiers lorsque HTTP_REFERER est un site étranger.
  • Doit permettre la création de liens dynamiques pour le domaine actuel (duh) sans le coder dans le .htaccess.
    • Pour le domaine actuel, il doit fonctionner sous http et https.
    • Pour le domaine actuel, il doit fonctionner avec www et sans www.
  • Il doit être possible d'ajouter des domaines d'exception à ces règles (comme notre ami Google) et ces domaines doivent fonctionner sous http et https et avec www ou sans www.

Voici ce que j'ai réalisé jusqu'à présent :

<IfModule mod_rewrite.c>

Options +FollowSymlinks
RewriteEngine On

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?mydomain.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?google.com/.*$ [NC]
RewriteRule \.(gif|jpe?g|png|zipx?)$ - [NC,F]

</IfModule>

Mes questions :

  1. Comment éviter le hardcode mydomain.com dans le fichier .htaccess ? (Ce serait formidable de pouvoir déployer ce .htaccess sur tous mes domaines sans avoir à le modifier pour chacun d'eux).
  2. Dans ma RewriteRule, gif|jpe?g|png|zipx? est équivalent à gif|jpg|jpeg|png|zip|zipx n'est-ce pas ? (Désolé, je suis encore novice en matière d'expressions régulières.)
  3. Voyez-vous quelque chose de mauvais dans mon .htaccess dont je ne suis pas au courant ?

Pour le numéro 1, je sais que c'est possible. Ce qui s'en rapproche le plus est cet extrait qui supprime le www de l'URL sans coder en dur le domaine. Existe-t-il un moyen d'utiliser cette méthode pour répondre à ma question n° 1 ?

RewriteCond %{HTTP_HOST} ^www\.(.+)
RewriteCond %{HTTPS}s/%1 ^(on(s)|offs)/(.+)
RewriteRule ^ http%2://%3%{REQUEST_URI} [L,R=301]

Mise à jour :

Je sais qu'il existe des solutions permettant d'afficher une image filigranée au lieu d'une image normale. Mais je ne cherche pas ce genre de solution. Je veux une universel solution (servant les erreurs 403) qui fonctionnera pour tous les types de fichiers binaires (zip, exe, iso, jpg, png, gif...).

9voto

voretaq7 Points 78924

Quoi que vous fassiez, vous "gaspillerez" des cycles d'unité centrale (pour déterminer si le site référent (celui qui établit le lien) est autorisé ou non, vous devez traiter les données de la demande).
La seule chose que vous pouvez faire est d'économiser de la bande passante tout en gaspillant une minimum de cycles CPU.

Hay quelques exemples dans les docs Apache qui font exactement ce que vous voulez. Celui-là :

SetEnvIf Referer example\.com localreferer
<FilesMatch \.(jpg|png|gif)$>
Order deny,allow
Deny from all
Allow from env=localreferer
</FilesMatch>

semble être le plus approprié (et ne nécessite pas le poids total de mod_rewrite).
Vous pouvez ajouter des référents valides supplémentaires à l'aide de l'option SetEnvIf y Allow des directives.

3voto

Daniel Points 3488

Que diriez-vous d'écrire une règle qui, si le référent est inconnu (ou interdit), appelle simplement un fichier Php où vous passez l'image comme paramètre, et dans le fichier Php, mettez simplement en gros rouge : "ce fichier vient de MYWEBSITE.COM et n'a pas l'autorisation officielle d'être montré ici".

Pour ce qui est de votre question, faites en sorte que votre règle soit globale. Corrigez-moi si je me trompe, mais si la règle est déclarée avant tout serveur virtuel, elle sera appliquée à tous les serveurs virtuels (sorte de "règle par défaut").

Et une autre idée est simple : il suffit de rediriger vers un fichier Php (ici filter.php ) qui consultera le site web autorisé et renverra le fichier requis si tout est en ordre :

RewriteRule /(.*)\.jpg$ /filter.php?im=$2\.jpg [QSA,L]

En filter.php charger dynamiquement une liste de serveurs virtuels ou quelque chose comme ça :

if (isset($_SERVER['HTTP_HOST'])) {
   if ((mb_ereg('thereferers\.I\.HATE\.com',HOST) !== false) ) {
       ... your code ...
   }
}

1voto

pablo Points 3020

Cloudflare peut vous être utile : http://www.cloudflare.com

Cela ne fonctionne toutefois que pour les images, mais cela semble être ce que vous recherchez.

Protection contre les liens hypertextes

Activez automatiquement la protection contre les liens hypertextes pour vos images afin d'éviter les liens hors site. Les référents qui ne sont pas dans la zone et qui ne sont pas vides se verront refuser l'accès. Les extensions de fichier prises en charge sont gif, ico, jpg, jpeg et png.

Protégé : http://mydomain.com/images/pic.jpg Pour contourner : http://mydomain.com/images/hotlink-ok/pic.jpg

0voto

genesis Points 343

Question 1 :

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^ http://(.+)?yoursite.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*.(jpe?g|gif|bmp|png)$ - [F]

question 2 :

ja

question 3

J'utiliserais mon unique

-1voto

Tom Newton Points 3961

Ou utilisez CoralCDN et laisser les gens faire des liens hypertextes à leur guise ?

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X