A vrai dire il n'y a pas de solution magique pour faire ca, juste des erzartz de solution.
La solution que tu as trouvé empèche à la personne qui tappe l'adresse de l'image d'y accéder si elle ne vient pas de ton site. Mais la limite est que le referer est parfaitement modifiable et donc n'est pas totalement fiable. De même, les navigateurs placent les images en cache pour accélérer la navigation. Par contre c'est efficace contre les sites qui veulent lier une image de ton site sur le leur, puisque il faudrait que l'internaute qui navigue sur leur site modifie le referer s'ils veulent accéder à l'image, ce qui n'est pas concevable.
Ce que tu peux faire pour limiter le téléchargement et la liaison de tes images sur les autres sites, c'est de combiner toutes les protections.
Tout d'abord il faut interdire l'acces à ton dossier d'images :
Fichier ".htaccess" :
Ensuite, tu crées un fichier "img.php" par exemple, qui va être appelé pour toutes les images de ton site. Pour indiquer qu'il va renvoyer une image, il faut utiliser le code suivant :
Code : Tout sélectionner
header("Content-Type: image/jpeg"); //Remplacer jpeg par le format de l'image passée en paramètre (gif, png, bmp, ...)
Rien ne dit que ca marchera, parce que certains navigateurs font leur chieur des fois, mais pour empêcher la mise en cache, tu mets ceci :
Code : Tout sélectionner
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Thu, 01 Jan 1970 00:00:00 GMT"); // Début de la période UNIX, les dates antérieures n'existent pas.
Pour empêcher l'acces à des personnes ne venant pas de ton site, tu peux utiliser un mécanisme d'identification de l'utilisateur (sessions, cookies, stockage de l'ip) sur ton site, et dans ton fichier "img.php", tu vérifie que ton utilisateur est bien passé sur ton site (depuis n secondes par exemple, c'est pas nécessaire de tester plus, car la page se charge avant les images). Exemple avec des cookies :
Fichier "index.php" :
Code : Tout sélectionner
setcookie("connected", "1", 0); // Crée un cookie pour la durée de la session
Fichier "img.php" :
Code : Tout sélectionner
if(!isset($_COOKIE["connected"]))
{
header("HTTP/1.0 403 Forbidden"); // Erreur 403
// Ou bien header("Location: image_avertissement.jpeg"); Dans ce cas, l'image en question ne doit pas se situer dans le dossier protégé.
exit();
}
Et pour lire l'image, il faut utiliser :
Code : Tout sélectionner
if($handle = fopen("image.jpeg", "rb"))
{
$str = "";
while(!eof($handle))
{
echo fread($handle, 8192);
}
fclose($handle);
}
La normalement tout y est. Tout le travail est fait
