Remplacer les liens directs sur les images par une autre image

cs_Chris31000 Messages postés 36 Date d'inscription lundi 29 mars 2010 Statut Membre Dernière intervention 5 novembre 2011 - 21 avril 2010 à 16:24
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 - 30 avril 2010 à 09:55
Bonjour,

Je me permet de vous solliciter parce que malgré mes nombreuses recherches sur le net je ne trouve aucune solution à mon problème et comme je suis vraiment nulle en programmation je suis incapable de le faire moi même.
Je suis dans une impasse.

Je souhaiterais empêcher les internautes de faire des liens directs sur mes images (par liens directs, j'entends copier/coller leurs url pour les afficher sur divers forums) mais sans les empêcher de les prendre (enregistrer sous ...)
J'ai mis en place des messages sur mon site, même en clic droit pour les avertir de les enregistrer sous mais rien à faire, je retrouve sans arrêt des liens directs ailleurs que sur mon site.
Je passe mon temps à renommer les dites images ou, lorsqu'il y en a trop, à renommer les dossiers sur le serveurs parce que du coup mes pages sont longues à charger.
Ça devient lassant.

Le problème c'est que mon site est hébergé chez free (bah oui!) et que celui ci a désactivé le mod_rewrite.
Aussi j'en appelle à vos connaissances pour savoir s'il y existe une solution alternative en php, sans avoir à modifier toutes mes pages, à ce code du fichier htaccess:

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?mon-site.fr(/)?.*$ [NC]
RewriteRule .*\.(gif|jpg|jpeg|bmp)$ http://Mon-image-de-remplacement.gif [R,NC]


C'est tout à fait ce que je recherche mais je ne peux pas l'utiliser en htaccess. :(
Cependant, si c'est faisable, est ce qu'il y a possibilité que ce fichier php puisse être placé uniquement dans les dossiers des images interdites de liens directs?

En espérant que vous pourrez m'aider, je vous remercie d'avance pour vos réponses.

24 réponses

cs_Chris31000 Messages postés 36 Date d'inscription lundi 29 mars 2010 Statut Membre Dernière intervention 5 novembre 2011
22 avril 2010 à 23:08
Personne? :(
0
cs_Chris31000 Messages postés 36 Date d'inscription lundi 29 mars 2010 Statut Membre Dernière intervention 5 novembre 2011
25 avril 2010 à 10:16
Toujours pas de réponse? Dois je ne déduire que n'est pas faisable?
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
25 avril 2010 à 12:17
Salut,

Il est possible de faire ceci sans mod_rewrite mais ceci nécessitera pas mal de modification dans ton code. Un exemple serait de ne jamais donner le lien direct vers les images mais vers une page php qui donnera le contenu d'une image, grâce à cet intermédiaire tu peux effectuer divers choses, par exemple la vérification du referer mais aussi des statistiques sur la visualisation des images etc. Voici un exemple simpliste qui te permettra d'effectuer la vérification du referer :

<?php

define('SITE_ADDR', 'http://example.com')
if (empty($_GET['img']) || empty($_SERVER['HTTP_REFERER']) ||
    strncmp($_SERVER['HTTP_REFERER'], SITE_ADDR, strlen(SITE_ADDR)) != 0)
  die();
$file = './img/' . basename($_GET['img']);
if (!file_exists($file))
  die();
$finfo = finfo_open(FILEINFO_MIME_TYPE);
header('Content-type: ' . finfo_file($finfo, $file));
finfo_close($finfo);
readfile($file);

?>


Ceci nécessite d'avoir dans le html des liens vers les images sous cette forme :

                
0
cs_Chris31000 Messages postés 36 Date d'inscription lundi 29 mars 2010 Statut Membre Dernière intervention 5 novembre 2011
25 avril 2010 à 12:30
Bonjour TychoBrahe,

Je te remercie pour ta réponse.

Est ce que le procédé que tu m'indique n'empêche pas les internautes d'enregistrer les images sur le disques durs?
Je souhaite seulement empêcher les liens directs, pas le téléchargement.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
25 avril 2010 à 16:48
Salut,

Pas plus que l'url rewriting dont tu as posté l'exemple.
0
cs_Chris31000 Messages postés 36 Date d'inscription lundi 29 mars 2010 Statut Membre Dernière intervention 5 novembre 2011
25 avril 2010 à 17:16
Oki merci

Ceci dit, ça ne remplacera pas l'image hotlinkée par une autre?
Que se passera t il si un internaute poste une de mes images sur un autre site ou sur un forum?

Ton code est il opérationnel en l'état?
Hormis le lien de mon site et le nom du fichier php, dois je y apporter des modifications?
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
25 avril 2010 à 17:37
Ceci dit, ça ne remplacera pas l'image hotlinkée par une autre?

Dans cet exemple non, enfin un simple readfile() de ton image à la place des die() et c'est fait..

Ton code est il opérationnel en l'état?
Hormis le lien de mon site et le nom du fichier php, dois je y apporter des modifications?

Il faut aussi adapter le répertoire dans lequel se trouvent les images et remplacer les die() par des readfile(). À noter que ce code suppose que les images soient toutes dans le même dossier ; par soucis de sécurité il est plus complexe de faire autrement vu qu'il faudrait alors interdire efficacement de remonter plus haut dans l'arborescence (le chroot à la main c'est un peu naze et générateur de failles). Toujours par soucis de sécurité, il faudrait rajouter une contrainte afin de ne jamais faire de readfile() de fichiers commençant par un point (fichier caché ou bien répertoire courant/supérieur).
0
cs_Chris31000 Messages postés 36 Date d'inscription lundi 29 mars 2010 Statut Membre Dernière intervention 5 novembre 2011
25 avril 2010 à 17:45
Je dois donc mettre readfile(lien-de-mon-image-de-remplacement) à la place de die()?

Le répertoire image c'est cette ligne?
$file = './img/'
où /img/ est le répertoire?

À noter que ce code suppose que les images soient toutes dans le même dossier

Je peux placer ce fichier php dans le répertoire image et créer ensuite un fichier par répertoire en modifiant bien entendu le nom du répertoire?

Toujours par soucis de sécurité, il faudrait rajouter une contrainte afin de ne jamais faire de readfile() de fichiers commençant par un point (fichier caché ou bien répertoire courant/supérieur).

Là c'est du chinois pour moi
Je ne dois donc pas remplacer die() par readfile()?
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
25 avril 2010 à 19:35
Je dois donc mettre readfile(lien-de-mon-image-de-remplacement) à la place de die()?

Le répertoire image c'est cette ligne?
$file = './img/'
où /img/ est le répertoire?

Oui

Je peux placer ce fichier php dans le répertoire image et créer ensuite un fichier par répertoire en modifiant bien entendu le nom du répertoire?

Aussi oui, mais bon ce n'est pas ce qu'il y a de mieux.

Là c'est du chinois pour moi
Je ne dois donc pas remplacer die() par readfile()?

Si, tu dois remplacer die() par readfile(). Je disais juste qu'il faudrait rajouter une condition du type substr(basename($_GET['img']), 0, 1) == '.' dans le premier if.
0
cs_Chris31000 Messages postés 36 Date d'inscription lundi 29 mars 2010 Statut Membre Dernière intervention 5 novembre 2011
26 avril 2010 à 12:43
Bonjour et merci pour ton aide TychoBrahe

J'ai trouvé ce script qui a l'air pas mal du tout, qu'en penses tu?
= > The CHImageGuard PHP Script

Je l'ai essayé sur une page test mais j'ai un souci, il ne prend pas en compte les sous dossiers si je ne le met pas directement à la racine du site ou dans le répertoire cible.
J'ai des dossiers comprenant plusieurs répertoires images
Par exemple:
le dossier A contient le répertoire image 1, le répertoire image 2, etc ... et je ne peux pas les mettre toutes ensembles (ce sont des images bien distinctes et les répertoires sont pas mal chargés)
Je suis donc obligé de faire plusieurs fichiers de ce script.php, jusque là pas de souci.

J'avais pensé faire un sous dossiers à la racine (appelé par exemple ScriptImage) et y placer les différents fichier php (script1.php, script2.php ...) chacun d'eux protégeant un répertoire distinct.
Mais je n'arrive pas à le faire fonctionner.

Je renseigne pourtant correctement le répertoire image dans cette ligne:
$imagedir  = "/put/your/full/image/directory/path/here/" ;

Mais il semblerait que le script ne puisse pas aller plus loin que les répertoires se trouvant dans le même dossier que lui.

Pareil pour l'image de remplacement, si elle n'est pas dans un répertoire du même dossier que le script, elle ne s'afffiche pas:
@readfile( "/your/replacement/image/filepath.gif" );


Aurais tu une explication et/ou une solution pour régler ce souci?

Merci encore
0
cs_Chris31000 Messages postés 36 Date d'inscription lundi 29 mars 2010 Statut Membre Dernière intervention 5 novembre 2011
26 avril 2010 à 17:38
Non c'est bon, j'y suis arrivé
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
26 avril 2010 à 21:24
Salut,

Attention à HTTP_REFERER, c'est une donnée provenant de l'utilisateur, qui n'est pas toujours présente, loin de là (modif des paramètres de confidentialité du browser soit par l'utilisateur, soit par d'autres softs style suite antivirus)

Ce que tu cherches à faire n'est pas si simple que cela. Si tu ne te bases que sur le HTTP-REFERER tu risques de priver pas mal d'internautes de tes photos, sans compter certains moteurs de recherche (ce dernier point étant à vérifier)

Je pense qu'il faut pondérer le pour et le contre, et dans tous les cas utiliser conjointement plusieurs méthodes (il en existe des dizaines !) :
- si HTTP-REFERER présent => c'est gagné
- si absent on peut jouer avec les cookies / sessions / variables passées en GET, etc ...

Une autre solution serait de passer en paramètre du script PHP qui affiche l'image un argument du style :



Côté PHP tu n'affiches l'image que si la valeur de $_GET['t'] est inférieure à mktime() + 30 sinon => image de remplacement (ou autre chose)
L'idée ici est de limiter la validé du lien à 30 sec, ce qui est grandement suffisant pour un affichage sur le browser de l'internaute, mais qui ne fonctionnera évidemment pas en copiant le lien ailleurs.

Encore une solution à l'aide de javascript :
Tu construis tes liens de la sorte :



Tu crées une fonction JS qui récupère toutes les images de ta page et les remplace par les vraies images en fonction de l'id.


La solution la plus efficace et la plus fiable reste la vérification de l'IP :
- tu étudies tes logs régulièrement
- tu relèves l'adresse IP des sites qui font des appels directs à tes images
- tu ajoutes ces IP dans un fichier texte, un tableau, ...
- tu vérifies lors de l'affichage que l'IP appelante ne fait pas partie des IP bannies
- tu agis en conséquence

Cette solution demande une surveillance régulière et manuelle, quoiqu'il soit possible d'automatiser le tout, voir de trouver des fichiers tout fait sur le net, mais avec elle tu ne privera pas certains internautes de tes photos, elle n'aura pas d'influence sur l'indexation de ton site par les moteurs de recherche, tu garderas une totale maitrise, et de plus elle très simple à mettre en place :
l'adress IP XXX.XXX.XXX.XXX du serveur "forum machin" n'a pas lieu de consulter ton site (c'est un serveur, pas un internaute), de ce fait tu peux lui interdire totalement ton site en une seule ligne présente au début de tes fichiers :
if ([IP du visiteur] == [IP présente dans les IP bannies]) {
exit;
// ou header("Location : mapaged'accueil");
// etc ...
}
(je sais, ça fait plus d'une ligne, c'est juste pour la présentation )


Cordialement,


Kohntark -
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
26 avril 2010 à 22:53
Salut,

J'ai trouvé ce script qui a l'air pas mal du tout, qu'en penses tu?

Je n'en pense que du mal. Le style de programmation est des plus laid : très lourd et révélateur de l'absence de maîtrise du PHP. De plus, le code risque de générer beaucoup d'avertissements et notices. Il utilise également une fonction dépréciée (eregi) dont l'existance dans les prochaines versions de PHP n'est pas garantie. Pour couronner le tout il est interdit par la licence de redistribuer le script... enfin de toute manière ce ne serai pas une bonne idée de le faire :)

Tu crées une fonction JS qui récupère toutes les images de ta page et les remplace par les vraies images en fonction de l'id.

Ce que tu cherches à faire n'est pas si simple que cela. Si tu ne te bases que sur le HTTP-REFERER tu risques de priver pas mal d'internautes de tes photos, sans compter certains moteurs de recherche (ce dernier point étant à vérifier)

J'en tendance à penser que le javeScript est bien pire en terme d'accessiblité, surtout pour les robots des moteurs de recherche.
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
26 avril 2010 à 23:42
J'avais vu juste !!
Je me doutais bien que j'allais avoir ce genre de remarque (justifiée), mais quand je me suis aperçu que j'avais oublié de le préciser j'avais déjà posté
Je pensais également que mon "il faut pondérer le pour et le contre" aurait suffi.

Cela étant je n'ai pas omis de préciser très clairement que la dernière solution était d'après moi la meilleure, même si elle demande un peu plus de main d'oeuvre et d'attention.
Tant que nous y sommes il faut indiquer qu'une source telle qu'un "scriptQuiAfficheLImage.php?img=tonImage&t=timestamp" pour une image n'est pas une bonne chose pour les moteurs de recherche, et c'est sans doute pire que le "imageBateau.jpg" de ma proposition en JS; à condition bien sur que l'on ne cherche pas à faire référencer ses photos (et d'autres critères), encore que même dans ce cas il y a plus de risques avec le "scriptquiaffiche.php?..."
... reste l'url rewriting.


J'en tendance à penser que le javeScript est bien pire en terme d'accessiblité,

Je suis bien évidemment d'accord avec toi, mais je modérerais un peu sur le "bien pire" :
Le HTTP-REFERER est très souvent supprimer par soucis de confidentialité. C'est très simple à mettre en oeuvre et ça ne pose que très rarement des problèmes de navigation. Côté développement il est aisé de s'en passer (je ne t'apprends rien )
Pour couronner le tout c'est à la mode de surfer "in private"

Concernant le JS, et je vais en faire bondir plus d'un, je ne prends plus en compte les navigateurs pour lesquels il est désactivé, sauf cas spécifiques ou lorsque la gestion de telles situations est simple à gérer.
Cela fait un bail que je n'ai pas regardé la proportion d'utilisateurs qui sont dans ce cas, mais il tend à diminuer fortement.
Je me demande bien comment on peut être capable de surfer sur le Web sans JS.
Rien que CS par exemple ... Désactive JS et tu n'iras pas loin.
Bref, un moment donné il faut arrêter de se prendre la tête avec les IE1 and Co; on ne maintiens plus les dedeuch' hein
Côté moteurs de recherche et accessibilité aux handicaps je suis d'accord, mais il y a d'autres techniques pour cela.



Cordialement,


Kohntark -
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
27 avril 2010 à 00:27
Je me demande bien comment on peut être capable de surfer sur le Web sans JS.

Quand tu es un sys adm en panique sur un serveur de prod et que tu n'as que lynx pour trouver une solution urgente à un problème pointu... Bref, considérer que les clients utilisent le JS ça se comprend, sauf pour les ressources critiques de ce genre.

(et après il y a des gens qui s'étonnent que je préfère les bons vieux livres papier)
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
27 avril 2010 à 01:17
Oups, désolé, mais pour le coup je n'ai absolument rien compris. Quel rapport entre un sys admin, Lynx et une interface utilisateur (ce sujet) ???


Kohntark -
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
27 avril 2010 à 11:41
Quel rapport entre un sys admin, Lynx et une interface utilisateur (ce sujet) ???

Le rapport est que lynx ne supporte pas du tout le JS, donc pour réagir au fait que tu prône ne non-support des clients n'utilisant pas JS car trop rares, je donnai juste un exemple dans lequel il est tout à fait concevable de naviguer sans JS. Remarque, pour le coup des images on s'en fiche un peu vu que lynx ne les affiche pas, quoique ça pourrait être possible grâce à la libcaca.
0
cs_Chris31000 Messages postés 36 Date d'inscription lundi 29 mars 2010 Statut Membre Dernière intervention 5 novembre 2011
27 avril 2010 à 13:51
Bonjour,

Tout d'abord je vous remercie tout les deux pour vos réponses et vos points de vue.

Concernant le JS, je préfèrerais ne pas avoir à l'utiliser dans ce cas présent.

kohntark, tu me parles de référencement, mais uniquement au niveau des images?
Parce que je ne vois pas bien comment bloquer l'affichage des images sur des sites autres pourrait être nuisible au référencement de mon site.
Si c'est uniquement au niveau des images, ce n'est pas un problème, mes images ne sont pas référencées (renseignévia un fichier robots.txt).

La structure de mon site utilise un mode hiérarchique, de ce fait et par choix personnel, je ne référence que l'index et toutes les pages mères (menu) et non les pages filles (celle qui contiennent les images).
Ceci dit, il a déjà 4 ans et n'est qu'un site perso, même s'il devait baisser un peu dans son référencement ce n'est pas très grave.

Pour ce qui est du script php que j'ai mentionné sur le lien donné plus haut, l'avantage, pour moi, c'est qu'il est tout fait, prêt à être utilisé.
Ce qui est un gros avantage pour quelqu'un qui n'y connais rien... puis j'aime bien l'idée de l'avertissement pas mail :þ

Maintenant si effectivement il doit me poser des problèmes, ou à mes visiteurs, je peux utiliser celui que tu me fourni TychoBrahe mais tu me dis qu'il faudrait le sécuriser, rajouter une condition (...) et comme déjà dit, je ne sais pas faire ce genre de chose.
Je reste dans une impasse.
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
27 avril 2010 à 20:48
kohntark, tu me parles de référencement, mais uniquement au niveau des images?

Oui, je parle des images, mais il n'est pas illusoire de penser que certaines choses puissent déplaire aux moteurs de recherche et influer sur le référencement global :
- des src de type fichier.php?src=truc pour les images
- un site ne contenant que des "imageDeRemplacement"

Le fichier robot.txt ne changera rien à ça.

Maintenant si effectivement il doit me poser des problèmes, ou à mes visiteurs, je peux utiliser celui que tu me fourni TychoBrahe

Je n'ai regardé que très succinctement le script que tu as indiqué, mais il me semble qu'il est basé, comme celui de TychoBrahe, sur l'unique HTTP-REFERER.
Dans un cas comme dans l'autre tu te heurteras au visiteur légitime qui n'envoie pas ce HTTP-REFERER ... et qui sera donc privé de tes images.

Je pense avoir été suffisamment explicite sur ce point, à toi de voir maintenant.

Le rapport est que lynx ne supporte pas du tout le JS, donc pour réagir au fait que tu prône ne non-support des clients n'utilisant pas JS car trop rares

Je ne prône pas, je dis juste qu'il y a depuis quelques années une "obligation de choix" :
- se priver des fonctionnalités du "machin truc web 2" pour permettre aux ancêtres d'IE / FF / netscape, à ceux qui déactivent tout, etc ... d'accéder correctement au contenu. Dans ce cas on fait du HTML3 et basta
- offrir un contenu plus riche au plus grand nombre, sans tomber dans l'absurdité du tout flash / tout jquery, etc ... et on concentre ses efforts pour rendre un minimum accessible le site pour les personnes atteintes de handicap (et uniquement pour elles, les utilisateurs d'IE5 => bye bye)

J'opte pour le second choix.
Il y aurait beaucoup à dire sur cette accessibilité, et ça en devient plus simple, en tous cas pour moi, de proposer un site alternatif à ces personnes.

Je sais bien que Lynx ne supporte pas le JS, mais "un sys adm en panique sur un serveur de prod qui n'a que Lynx sous la main pour trouver une solution à un problème pointu" ... heu, comment dire ... il devrait changer de métier, ou d'époque


Bonne soirée à vous,


Kohntark -
0
cs_Chris31000 Messages postés 36 Date d'inscription lundi 29 mars 2010 Statut Membre Dernière intervention 5 novembre 2011
28 avril 2010 à 14:33
Bonjour kohntark,

Je comprends bien ce que tu me dis et je respecte ton opinion, cependant ça ne résout pas vraiment mon problème.

- Je ne sais pas mettre en œuvre le script de TychoBrahe,
- celui que j'ai trouvé (donné sur le lien en page 1) n'apparait pas correct du point de vue de TychoBrahe et, après l'avoir testé sur plusieurs de mes pages semble faire ramer le chargement de mes images ... et m'envoie de temps en temps sur une page de free me signalant "[i]Service d'envoi de fichiers http://dl.free.fr
Stockage détécté sur les pages personnelles/i"
- et je ne connais pas plus le JS pour mettre en place, comme tu me le conseille, un script qui remplirait la même fonction.

Que dois je faire?
Comment résoudre mon problème? (hormis changer d'hébergeur, car la n'est pas le but de ma question)
Merci d'avance.
0
Rejoignez-nous