Comment éviter les liens à chaud («vol d'images» / «vol de bande passante») de ressources sur mon site?

8

J'essaie d'écrire le .htaccess "ultime" anti liaison à chaud ...

Vous pouvez trouver de nombreux exemples / tutoriels / générateurs sur le net mais beaucoup d'entre eux sont faux ou incomplets (ou même les deux).

Ce sont les fonctionnalités que je recherche:

  • Doit bloquer la liaison à chaud pour une liste d'extensions de fichiers lorsque HTTP_REFERER est un site étranger.
  • Doit autoriser la liaison à chaud 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.
  • Doit pouvoir ajouter des domaines d'exceptions à 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 de coder mydomain.comen dur dans le .htaccess? (Ce serait formidable de pouvoir déployer ce .htaccess sur tous mes domaines sans avoir à le modifier pour chacun d'eux.)
  2. Dans mon RewriteRule, gif|jpe?g|png|zipx?est équivalent à gif|jpg|jpeg|png|zip|zipxvrai? (Désolé encore nouveau pour les expressions régulières.)
  3. Voyez-vous quelque chose de mauvais dans mon .htaccess que je ne connais pas?

Pour # 1, je sais que c'est quelque peu possible. Le plus proche que j'ai trouvé 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 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 connais des solutions qui serviront une image en filigrane au lieu de la normale. Mais je ne cherche pas ce genre de solution. Je veux une solution universelle (servir 403 erreurs) qui fonctionnera pour tout type de fichiers binaires (zip, exe, iso, jpg, png, gif ...).

AlexV
la source
IMHO Apache devrait venir avec ce fichier de configuration au moins comme option à inclure. Je me demande si des développeurs Apache seraient prêts à l'ajouter si vous / nous pouvions en proposer un?
Chris Nava
5
Non. Voici pourquoi - tomoconnor.eu/blogish/mod-rewrite-killing-social-media
Tom O'Connor
@Tom O'Connor Lecture intéressante et je suis d'accord avec cela. Mais mon script dans mon cas sera utilisé pour les gros fichiers binaires (comme zip, exe ...) et non pour les images et autres. Il me faudrait donc toujours obtenir une réponse. Oui, la bande passante est bon marché, mais un zip de 500 Mo n'est pas la même chose qu'un jpg de 100 Ko ...
AlexV
Je n'esquivais pas une réponse. J'étais juste en train de râler;)
Tom O'Connor

Réponses:

9

Peu importe ce que vous faites, vous «gaspillerez» les cycles de l'UC (pour déterminer si le site référent (celui qui fait le lien) est autorisé ou non, vous devez effectuer un certain traitement des données de la demande).
La seule chose que vous pouvez faire est d'économiser de la bande passante tout en gaspillant un minimum de cycles CPU.

Il y a quelques exemples dans les Apache Docs 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 applicable (et ne nécessite pas le poids total de mod_rewrite).
Vous pouvez ajouter des référents valides supplémentaires avec des directives supplémentaires SetEnvIfet Allow.

voretaq7
la source
Pas mal, mais j'ai besoin d'une solution qui ne code pas en dur le nom de domaine dans le htaccess (lire attentivement ma question).
AlexV
Ensuite, vous avez besoin d'une solution de programmation comme celle proposée par Oliver (qui vous oblige toujours à coder en dur une liste, une expression régulière ou une autre représentation des référents autorisés - Elle vous permet simplement de la mettre dans un fichier discret)
voretaq7
Pas nécessairement si vous regardez mon 2ème bloc de code, vous pouvez voir que cela peut être fait ... J'ai juste besoin de l'adapter à mon cas ...
AlexV
Vous pouvez utiliser la logique de nettoyage dans votre deuxième bloc de code (ou une magie similaire uniquement %{HTTP_HOST}pour une analyse syntaxique moins régulière) pour insérer l'hôte de l'URL dans votre ensemble de règles, ce qui devrait vous acheter des domaines locaux dynamiques (tester intensivement), mais vous auriez encore besoin de dur -code "gentils" référents externes comme Google (par référent, agent utilisateur, IP, etc.)
voretaq7
3

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

Quant à votre question, rendez votre règle globale. Corrigez-moi si je me trompe, mais si la règle est déclarée avant tout vhost, elle sera appliquée sur tous les vhost (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 va chercher dans le site Web autorisé et retourner le fichier requis si tout va bien:

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

En filter.phpchargeant simplement dynamiquement une liste de vhost ou quelque chose comme ça:

if (isset($_SERVER['HTTP_HOST'])) {
   if ((mb_ereg('thereferers\.I\.HATE\.com',HOST) !== false) ) {
       ... your code ...
   }
}
Olivier Pons
la source
C'est une possibilité, mais je ne veux pas "gaspiller" le CPU sur cela (en utilisant PHP). Je veux seulement servir 403s. De plus, avec PHP, vous devez gérer tous les problèmes de mise en cache et cela peut être assez complexe.
AlexV
1

Cloudflare peut vous être d'une certaine utilité: http://www.cloudflare.com

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

Protection Hotlink

Activez automatiquement la protection par lien hypertexte pour vos images pour é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 fichiers 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

pablo
la source
0

question 1:

RewriteEngine On
RewriteCond% {HTTP_REFERER}! ^ Http: // (. +)? Yoursite.com/ [NC]
RewriteCond% {HTTP_REFERER}! ^ $
RewriteRule. *. (Jpe? G | gif | bmp | png) $ - [F]

question 2:

Oui

question 3

J'utiliserais mon seul

genèse
la source
Pour la question 1, "votresite.com" est codé en dur, donc ce n'est pas utile.
AlexV
@AlexV: Ce n'est pas le cas. Remplacez simplement votresite.com par votre adresse que vous souhaitez autoriser et les autres référents ne pourront pas télécharger d'images
genesis
Et comment je m'autorise sans le coder en dur?
AlexV
-1

Ou utiliser CoralCDN ant let folk hotlink vers le contenu de leur cœur?

Tom Newton
la source