Interdire hotlinking d'image & URL Directe

Interdire hotlinking d'image & URL Directe - PHP - Programmation

Marsh Posté le 28-09-2010 à 11:29:18    

Bonjour,
je souhaiterais empêcher le hotlinking de mes images ainsi que l'affichage de lien direct d'une image dans l'explorateur.
 
Une solution proposée pour le hotlinking est l'utilisation d'un .htaccess (URL Rewrite)
 

Code :
  1. RewriteEngine On
  2. RewriteCond %{HTTP_REFERER} !^$
  3. RewriteCond %{HTTP_REFERER} !^http://www.site.be/.*$ [NC]
  4. RewriteCond %{HTTP_REFERER} !^http://www.site.be/.*$ [NC]
  5. ReWriteRule .*\.(gif|GIF|jpg|JPG|bmp|BMP|jpeg|JPEG)$ http://www.site.be/images/email.gif [R,NC]


 
Cela marche bien mais ne fonctionne pas pour l'affichage de lien direct dans l'explorateur, genre: www.site.be/images/img001.jpg
 
Pourriez vous m'aider sur la façon d'arriver à empêcher ce genre de liens.
Je vous remercie.
N.B.: je ne sais pas vraiment dans quelle section mettre cette question.

Reply

Marsh Posté le 28-09-2010 à 11:29:18   

Reply

Marsh Posté le 28-09-2010 à 15:51:39    

salut,
 
je ne suis pas sur que tu puisses faire ca. le navigateur a besoin de pouvoir accéder à http://www.site.be/images/img001.jpg pour pouvoir l'afficher dans la page, donc même en checkant le referer ca me parait pas faisable... :spamafote:
 
++

Reply

Marsh Posté le 28-09-2010 à 15:53:44    

Idem (sans compter que je trouve ce genre de limitation totalement débile). Mon navigateur par exemple n'envoie pas toujours le referer (pas  envie de dire aux différents sites depuis où j'arrive)


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 28-09-2010 à 15:55:10    

esox_ch a écrit :

(sans compter que je trouve ce genre de limitation totalement débile)

anéfé.

Reply

Marsh Posté le 28-09-2010 à 18:03:39    

C'est possible en bloquant le referer vide, mais problématique lorsque le navigaeur ou le pare-feu supprime le référer. Donc, à éviter.


---------------
http://www.aideinfo.com/  Whois adresses IP/domaines le plus évolué !!  FAQ Free Mobile
Reply

Marsh Posté le 28-09-2010 à 20:39:20    

aideinfo a écrit :

C'est possible en bloquant le referer vide, mais problématique lorsque le navigaeur ou le pare-feu supprime le référer. Donc, à éviter.


Relis la question du monsieur :o
Il veut éviter qu'on lui load l'image directement dans le navigateur. ça n'a rien à voir avec le referer :o


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 28-09-2010 à 20:46:46    

Si ça a à voir. Quand tu saisis l'URL de l'image dans le navigateur, tu outrepasses l'anti hotlink, car le referer est vide.


---------------
http://www.aideinfo.com/  Whois adresses IP/domaines le plus évolué !!  FAQ Free Mobile
Reply

Marsh Posté le 28-09-2010 à 22:00:05    

afficher l'image via readfile ou fpassthru ?
 

Spoiler :

je ne sais pas si ça pourrait marcher ni si c'est bien...


---------------
oui oui
Reply

Marsh Posté le 29-09-2010 à 08:47:13    

esox_ch & pataluc: que proposeriez vous comme alternative?
 
=> des commentaires sur les méthodes proposées par art_dupond (readfile ou fpassthru)
 
Merci

Reply

Marsh Posté le 29-09-2010 à 08:55:54    

aideinfo a écrit :

Si ça a à voir. Quand tu saisis l'URL de l'image dans le navigateur, tu outrepasses l'anti hotlink, car le referer est vide.


 
Absolument pas :o. Si tu vas sur un site X.com et après tu saisis l'URL de l'image, ton referer sera pas vide
 

art_dupond a écrit :

afficher l'image via readfile ou fpassthru ?
je ne sais pas si ça pourrait marcher ni si c'est bien...


ça ne marche pas. Ce système est utilisé généralement pour autoriser l'affichage d'un document (p.ex. une image) seulement dans certaines conditions (par exemple, si l'utilisateur est authentifié sur le site). En aucun cas ça ne permet de savoir dans quel cadre l'image est chargée.
 

Yellow-Sky a écrit :

esox_ch & pataluc: que proposeriez vous comme alternative?


ça dépend de ce que tu veux faire. Partant de l'idée que d'empêcher l'utilisateur de saisir l'adresse de l'image dans l'URL est impossible, à toi de nous dire la suite


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 29-09-2010 à 08:55:54   

Reply

Marsh Posté le 29-09-2010 à 09:11:40    

esox_ch a écrit :

Idem (sans compter que je trouve ce genre de limitation totalement débile).


 
sauf quand des crétins utilisent de gros fichiers dispos sur ton serveur pour faire des backgrounds sur le leur : c'est ta BP qui morfle. Perso j'ai mis en place un petit rewrite qui a du décoller quelques rétines et faire vomir qq bassines... au bout de 3 jours j'avais plus aucun hotlinking


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 29-09-2010 à 09:22:38    

Tu l'as fait avec le referer? Donc referer vide ou != de ton site => Mauvaise image?
T'as pas peur que les gens (genre moi :D) se mangent la mauvaise image?


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 29-09-2010 à 09:28:06    

esox_ch a écrit :

Tu l'as fait avec le referer? Donc referer vide ou != de ton site => Mauvaise image?
T'as pas peur que les gens (genre moi :D) se mangent la mauvaise image?


 
j'ai ciblé les relous :o
 

RewriteEngine On
RewriteCond %{HTTP_REFERER} ^.*(hi5|myspace|xanga|friendster|blogspot|imvu|whatboyswant)\.com/.*$ [NC]
RewriteRule \.(gif|jpg|jpeg|GIF|JPG|JPEG|png|PNG)$ no_leech.jpg


 
ça a du chialer dans les chaumières :o


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 29-09-2010 à 09:47:58    

whatboyswant.com :lol:
En effet, pas mal :D Par contre ça demande à ce que tu suives les logs :D
 
Et aussi, tu gères comment le fait que qqn qui est sur myspace, et veut ensuite venir sur ton site, se mange pas un no_leech.jpg?


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 29-09-2010 à 10:09:03    

esox_ch a écrit :

whatboyswant.com :lol:
En effet, pas mal :D Par contre ça demande à ce que tu suives les logs :D
 
Et aussi, tu gères comment le fait que qqn qui est sur myspace, et veut ensuite venir sur ton site, se mange pas un no_leech.jpg?


 
je m'en cogne de myspace, personne ne linke de là bas vers chez moi  [:bakk48]


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 29-09-2010 à 10:22:34    

Ok :D


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 29-09-2010 à 13:21:14    

black_lord a écrit :

sauf quand des crétins utilisent de gros fichiers dispos sur ton serveur pour faire des backgrounds sur le leur : c'est ta BP qui morfle. Perso j'ai mis en place un petit rewrite qui a du décoller quelques rétines et faire vomir qq bassines... au bout de 3 jours j'avais plus aucun hotlinking


black_lord a écrit :

j'ai ciblé les relous :o

RewriteEngine On
RewriteCond %{HTTP_REFERER} ^.*(hi5|myspace|xanga|friendster|blogspot|imvu|whatboyswant)\.com/.*$ [NC]
RewriteRule \.(gif|jpg|jpeg|GIF|JPG|JPEG|png|PNG)$ no_leech.jpg


ça a du chialer dans les chaumières :o


Là c'est un poil différent comme idée (et vachement mieux d'ailleurs), tu bloques les emmerdeurs uniquement, tu bloques pas tout par défaut.

Message cité 1 fois
Message édité par 0x90 le 29-09-2010 à 13:21:23

---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 29-09-2010 à 13:35:51    

0x90 a écrit :


Là c'est un poil différent comme idée (et vachement mieux d'ailleurs), tu bloques les emmerdeurs uniquement, tu bloques pas tout par défaut.


j'suis un sniper [:franck75]


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 29-09-2010 à 13:40:52    

Oué enfin t'as toujours les soucis que t'as avec toutes les black-list : Faut les garder à jour :/
Mais en effet c'est nettement plus ciblé :o


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 29-09-2010 à 16:39:25    

esox_ch a écrit :


 
ça ne marche pas. Ce système est utilisé généralement pour autoriser l'affichage d'un document (p.ex. une image) seulement dans certaines conditions (par exemple, si l'utilisateur est authentifié sur le site). En aucun cas ça ne permet de savoir dans quel cadre l'image est chargée.


 
On ne pourrais pas dire d'afficher uniquement si une variable est présente dans la page ?
 


---------------
oui oui
Reply

Marsh Posté le 29-09-2010 à 18:33:17    

Non, parce que ça se fait en 2 temps:
- Le code HTML de la page est généré (et là, faut un <img src="..." /> valide)
- Le navigateur va chercher les différentes images et les affiche
 
Il pourrait éventuellement jouer sur le fait que les images seront loadées juste après la page, et limiter ce délai, mais ça veut dire que la 1ere fois qu'il y un lag, tout explose


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 30-09-2010 à 12:34:00    

Ca marcherait pas un truc comme ça (juste pris l'exemple de la doc) ?

 

images/show_image.php

Code :
  1. <?php
  2. if(!isset($_SESSION['ok']))
  3. {
  4.  exit;
  5. }
  6.  
  7. $image = $_GET['image'];
  8. // open the file in a binary mode
  9. $name = './'.$image;
  10. $fp = fopen($name, 'rb');
  11.  
  12. // send the right headers
  13. header("Content-Type: image/png" );
  14. header("Content-Length: " . filesize($name));
  15.  
  16. // dump the picture and stop the script
  17. fpassthru($fp);
  18.  
  19. ?>
 

et dans index.php

Code :
  1. <?php
  2. $_SESSION['ok'] = 1;
  3. ?>
  4.  
  5.  
  6. <img src="./images/show_image.php?image=monimage.jpg" />
 


edit: ah mais non, ça n'empêcherait pas de voir l'image...
re-edit: ah mais si si on unset la variable de session à la fin de show_image.php


Message édité par art_dupond le 30-09-2010 à 12:39:20

---------------
oui oui
Reply

Marsh Posté le 30-09-2010 à 12:54:34    

Non non non.
Une fois que tu auras accédé pour la 1ere fois à index.php, tu auras accès autant de fois que tu veux à l'image (même en tapant l'URL dans ton browser)


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 30-09-2010 à 14:03:14    

pas si je unset la variable :)


---------------
oui oui
Reply

Marsh Posté le 30-09-2010 à 14:08:53    

Juste avant la fin du fichier show_image.php?


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 30-09-2010 à 14:12:58    

art_dupond a écrit :

pas si je unset la variable :)


en admettant que ca fonctionne, tu ne pourrais plus utiliser cette technique qu'une fois dans ta page du coup...

Reply

Marsh Posté le 30-09-2010 à 14:17:13    

pataluc a écrit :


en admettant que ca fonctionne, tu ne pourrais plus utiliser cette technique qu'une fois dans ta page du coup...


remarque judicieuse. Je pars réfléchier :)

 

edit: pit-être via un helper qui crée le tag image et la variable de session qui va avec en fonction du nom de l'image ? faudrait juste pas afficher 2 fois la même image dans la même page...

  


esox_ch > ou même juste après le test d'existence en fait :)


Message édité par art_dupond le 30-09-2010 à 14:24:47

---------------
oui oui
Reply

Marsh Posté le 30-09-2010 à 14:21:02    

Il pourrait s'en sortir en utilisant une variable de session par image.
Par contre, même là, il ne pourra pas afficher 2x la même image sur la même page.
 
Et même ... vous voyez le bordel que ça va faire sur le serveur si tout à coup il fout ça sur un site qui à 100'000 hits/sec  [:k-nar]


Message édité par esox_ch le 30-09-2010 à 14:21:10

---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 30-09-2010 à 14:32:27    

paie ton usine à gaz... t'es sur d'en avoir absolument besoin?

Reply

Marsh Posté le 30-09-2010 à 14:33:22    

ben j'ai bien dit que je ne savais pas si c'était bien [:spamafote]  

Spoiler :

apparemment via fread ce serait déjà mieux : http://be2.php.net/manual/en/funct [...] .php#55001


 
Je voulais juste savoir si c'était possible et comme tu disais que non, j'ai test :)


---------------
oui oui
Reply

Marsh Posté le 30-09-2010 à 14:36:55    

black_lord a écrit :

RewriteEngine On
RewriteCond %{HTTP_REFERER} ^.*(hi5|myspace|xanga|friendster|blogspot|imvu|whatboyswant)\.com/.*$ [NC]
RewriteRule \.(gif|jpg|jpeg|GIF|JPG|JPEG|png|PNG)$ no_leech.jpg



 
tu met le NC sur l'un mais pas sur l'autre ?
 

RewriteRule \.(gif|jpg|jpeg|png)$ no_leech.jpg [NC]


 
 

Reply

Marsh Posté le 30-09-2010 à 14:45:09    

Une solution possible (mais très laide), c'est de garder la même idée que ton show_image.php, mais de passer en plus un paramètre qui change à chaque fois (un nombre aléatoire, par exemple). Côté serveur, on garde la liste des numéros qui ont été émis, on accepte d'afficher l'image que si le numéro est dans liste, et on le retire immédiatement après. Une url est ainsi à usage unique.
 
Si la même image apparaît plusieurs fois sur une même page, c'est pas un problème, il suffit 2 numéros différents.
 
Par contre, niveau performance, ça risque d'être vraiment atroce, parce qu'une solution du genre empêche complètement le browser d'utiliser son cache.

Reply

Marsh Posté le 30-09-2010 à 14:46:14    

Dans la catégorie comment faire exploser la bande passante, la ram et le CPU d'un serveur en même temps  :ouch:


Message édité par esox_ch le 30-09-2010 à 14:46:23

---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 30-09-2010 à 14:48:52    

J'ai bien dit que c'était très laid :)
 
Encore que, niveau CPU et RAM, c'est pas si méchant que ça, c'est surtout la BP qui va gonfler.


Message édité par Riokmij le 30-09-2010 à 14:49:35
Reply

Marsh Posté le 30-09-2010 à 14:53:28    

Bein écoute à chaque fois que tu fais ton readfile, ton apache va charger le fichier en ram avant de l'envoyer.
Donc au lieu de pouvoir simplement tout passer par apache comme fichier statique, il va continuer a le charger à travers PHP, ce qui va représenter un overhead considérable :bounce:


Message édité par esox_ch le 30-09-2010 à 14:53:40

---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 30-09-2010 à 14:57:01    

Et quand c'est Apache qui l'envoie comme un fichier statique, il doit pas le charger en RAM peut-être ? :D

Reply

Marsh Posté le 30-09-2010 à 15:18:26    

Si, mais il est optimisé pour le faire avec des mises en cache etc.. Alors que là quand tu le load dans PHP, ça te crée une couche supplémentaire que Apache ne mettra pas en cache.  
Je suis assez sûr que ça te changes pas mal la charge d'un serveur :o


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 30-09-2010 à 15:23:04    

La mise en cache, c'est fait au niveau du système d'exploitation, Apache ne fait rien du tout lui-même.
 
À moins que la fonction PHP soit particulièrement mal écrite (ce qui est tout à fait possible, PHP n'étant pas vraiment réputé pour la qualité de son code), ça va revenir exactement au même : une série d'appels systèmes "read", puis écriture du buffer dans la socket.

Reply

Marsh Posté le 30-09-2010 à 15:25:07    

Ca m'étonnerait beaucoup que ça soit fait au niveau de l'OS :o Suffi de voir que tu peux paramétrer ça autant dans Apache que dans PHP :o
Enfin bon, vu que j'ai pas de bentch sous la main, je peux pas l'affirmer, mais je doute franchement que le fait de faire une suite de readfiles() dans PHP soit aussi rapide et léger que le fait d'y pointer directement dessus avec le browser


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed