web-dev-qa-db-fra.com

Comment se fait l'anti-hotlinking?

En termes de site Web, hotlinking est

l'utilisation d'un objet lié, souvent une image, d'un site vers une page Web appartenant à un deuxième site. Le deuxième site est censé avoir un lien en ligne vers le site où se trouve l'objet.

Que signifie anti-hotlinking? Comment un site Web peut-il empêcher les demandes provenant d'un autre serveur?

4
Lazer

La technique habituelle consiste à utiliser mod_rewrite comme suggéré par Josh. Ce n'est pas parfait, mais supprime la majorité des liens dynamiques, ce qui ferait probablement le travail que vous recherchez.

Il existe un moyen plus complexe qui garantit quasiment tout lien direct: assurez-vous que chaque visiteur doit utiliser une URL différente pour obtenir la même image:

  1. Placez les fichiers image où le serveur Web ne peut généralement pas les voir (afin qu'ils ne puissent pas être directement adressés par une simple URL)
  2. Lorsque vous envoyez une page qui utilise une image, générez un code aléatoire pour faire référence à cette instance de cette image (par exemple, utilisez les fonctions UUID de votre langage de script pour renvoyer un UUID aléatoire ou utilisez un hachage salé de l'heure actuelle en millisecondes). epoc), et déposez une ligne dans une base de données contenant ce code et le nom + l'emplacement du fichier image ainsi que l'heure actuelle
  3. Renvoyer au navigateur appelant une balise d'image ou un lien appelant un script contenant ce code dans l'URL.
  4. Lorsque le navigateur demande à ce script, recherchez la bonne image dans la base de données à l'aide du code et renvoyez ses données.
  5. Supprimez régulièrement les lignes de la base de données si elles datent d’au moins une heure. Cela signifie que le lien vers l'image n'est valide que pendant une heure. Vous pouvez raccourcir ce délai pour les images en ligne. Par exemple, ne les conservez que pendant une minute ou deux, ce qui réduit le temps de validité du lien vers l'image.

Cela présentait quelques inconvénients majeurs:

  • Votre page doit être scriptée, transformant ce qui pourrait être une page HTML statique en quelque chose qui nécessite un processeur de script volumineux tel que PHP à exécuter
  • Chaque demande pour l'une des images protégées est également une réponse scriptée au lieu d'une simple demande d'objet statique. Vous pouvez contourner ce problème en utilisant des liens de système de fichiers plutôt que des entrées de base de données si votre système d'exploitation et votre système de fichiers le prennent en charge. Créez simplement un lien vers l'image à un emplacement connu du système de fichiers visible par le serveur Web, puis envoyez une URL normale à cet emplacement. vous envoyez donc une balise d’image qui fait référence à http://yourhost/images/random-code-blah-123456.jpg. Ensuite, il vous suffit d'effacer les liens régulièrement au lieu de supprimer les lignes de la base de données. Si vous ne voulez pas (ou ne pouvez pas) gérer les liens, copiez simplement le fichier - mais cela entraîne beaucoup de charge d'E/S supplémentaire pour chaque demande de page.
  • Vous frappez votre base de données plus que vous n'auriez autrement besoin. La méthode symlink/hardlink/fichier-copie permet de contourner ce problème.
  • Les images sont disponibles pour une liaison directe pendant la période de temporisation. Vous pouvez contourner ce problème en utilisant une partie de l'adresse IP de l'appelant dans le code du fichier. N'utilisez pas toutes les adresses IP, même si de nombreux utilisateurs sont bloqués par des proxies susceptibles de modifier leur adresse de manière aléatoire (vous devriez être sûr d'utiliser la première moitié de l'adresse, à moins que le spectateur utilise un réseau de proxy global anonyme, comme Tor). . Cela ne fonctionne que pour l'approche entièrement scriptée cependant.

Si tout cela vous semble trop demander, vous avez probablement raison. Choisissez l'option mod_rewrite - elle est généralement assez efficace, impose beaucoup moins de charge à vos serveurs et nécessite beaucoup moins de travail de configuration.

7
David Spillett

Vous pouvez empêcher les liens hypertexte avec un fichier .htaccess correct qui vérifie le référent.

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?mydomain.com/.*$ [NC]
RewriteRule \.(gif|jpg)$ http://www.mydomain.com/angryman.gif [R,L]
3
Josh K