IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Apache Discussion :

.htaccess pour protéger mes images


Sujet :

Apache

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 192
    Par défaut .htaccess pour protéger mes images
    Bonjour,

    J'ai crée le htaccess suivant qui empêche un internaute d'accéder directement(hotlink) à une image de mon site. Le htaccess se situe dans le dossier: http://192.168.1.34/images

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    RewriteEngine on
    RewriteCond %{HTTP_REFERER} !^http://192.168.1.34 [NC]
    RewriteRule .*\.jpg$ http://192.168.1.34/erreur.gif [R,L]
    Jusque là ca fonctionne puisque que lorsque j'accède à l'adresse:
    http://192.168.1.34/images/image1.jpg, je suis redirigé vers l'image erreur.gif.

    Mais j'aimerais que lorsque j'accède implicitement à une image ex:
    http://192.168.1.34/images.php?id=1, je peux accéder à l'image image1.jpg
    qui est situé dans le dossier images.

    Est-ce faisable?

    Merci

  2. #2
    Expert confirmé
    Avatar de Michaël
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    3 497
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2003
    Messages : 3 497
    Par défaut
    salut,
    essaie avec ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RewriteRule image[0-9]*\.jpg$ http://192.168.1.34/images.php?id=$1 [L]

  3. #3
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Par défaut
    Citation Envoyé par persia Voir le message
    Mais j'aimerais que lorsque j'accède implicitement à une image ex:
    http://192.168.1.34/images.php?id=1, je peux accéder à l'image image1.jpg
    qui est situé dans le dossier images.
    Tu peux détailler la question ? images.php n'est pas dans le répertoire /images donc est appelable directement sans que le referrer fasse référence à ton site. Jusqu'ici, je ne vois pas le problème, mais comme je ne sais pas ce que fait ce script ni ne comprends bien ce que tu veux faire, je ne vois pas le rapport avec le répertoire images et sa protection par referrer

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 192
    Par défaut
    Citation Envoyé par _Mac_ Voir le message
    Tu peux détailler la question ?
    image.php est dans le dossier :http://192.168.1.34/images/.

    Dans la page image.php, j'ai le chemin exacte de mon image que je veux protéger, donc, l'internaute ne saura pas ou se situe la chemin exact de mes images, puisque c'est le chemin est caché dans ma page image.php.

    image.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
     
    $id = (isset($_GET['id'])) ? intval($_GET['id']) : '1';
     
    $url[1] = <a href="http://192.168.1.34/images/image1.jpg&#39;;" target="_blank">http://192.168.1.34/images/image1.jpg';</a>
    $url[2] = <a href="http://192.168.1.34/images/image2.jpg&#39;;" target="_blank">http://192.168.1.34/images/image2.jpg';</a>
     
    header("Location: " . $url[$id]);
    ?>
    Donc, je veux que lorsque l'utilisateur tape l'adresse:
    http://192.168.1.34/images.php?id=1, ca ouvre l'image avec l'id 1, c-a-d
    image1.jpg, et quand il tape directement l'url de l'image:http://192.168.1.34/images/image1.jpg ca le redirigre vers l'image erreur.jpg

    Tu comprends maintenant ce que je veux faire ?

  5. #5
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Par défaut
    Oui, c'est plus clair.

    Le souci avec header("Location: " . $url[$id]); dans images.php c'est que finalement, tu te trompes, l'URL finale de l'image n'est pas cachée puisque qu'elle est transmise au navigateur : avec un clic droit sur l'image une fois affichée, on doit voir http://192.168.1.34/images/image1.jpg et pas http://192.168.1.34/images.php?id=1. Je te propose donc la chose suivante :
    • .htaccess :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      RewriteEngine on
       
      # On redirige tout appel explicite a une image sur l'image d'erreur
      RewriteRule .*\.jpg$ http://192.168.1.34/erreur.gif [R,L]
    • images.php :
      Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      <?php
       
      $id = (isset($_GET['id'])) ? intval($_GET['id']) : '1';
       
      // Chemins relatifs des images par rapport a images.php
      $url[1] = 'images/image1.jpg';
      $url[2] = 'images/image2.jpg';
       
      // En-tete HTTP
      // On suppose que toutes les images sont des JPEG
      header('Content-Type: image/jpeg');
      header('Content-Length: ' . filesize($url[$id]));
      flush();
      // Image
      readfile($url[$id]);
      ?>

    Comme ça, les images ne seront accessibles qu'avec images.php et jamais directement.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 192
    Par défaut
    Citation Envoyé par _Mac_ Voir le message
    Comme ça, les images ne seront accessibles qu'avec images.php et jamais directement.
    Merci bien,ca marche comme je le voulais.Mais selon toi, avec cette technique,
    l'image reste dans le cache de l'utilisateur (Temporary files) c-a-d que l'utilisateur pourra accéder directement à l'image depuis son disque dur ?.
    Si oui, ya t-il un moyen d'empêcher l'image d'être stocké dans le temporary files de l'utilisateur?. J'ai pensé aux 2 headers suivants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    header("Cache-Control: no-cache, must-revalidate"); 
    header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
    Est-ce suffisant, ou bien il faut plus que ca ?

    Merci

  7. #7
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Par défaut
    A priori c'est suffisant. De toute façon, on peut toujours arriver à enregistrer les images si on veut vraiment

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 192
    Par défaut
    Salut Mac,

    Je viens de remarquer un petit hic.

    Dans ma page où je charge mon image, j'ai des liens en haut pour consulter d'autres images de mon site.

    Quand je charge une image de grande taille: 1 mo, et qu'au même moment, je clique sur un des liens en haut de ma page, je dois attendre la fin du chargement de l'image pour que je puisse être rediriger vers une autre image.

    Autrement dit, je dois attendre la fin du chargement de l'image pour que les autres liens de ma page prennent effet.

    Ceci est du à quoi au juste, au readfile(), au flush() ?, ya t-il une façon de contourner ce problème ?c-a-d pas besoin d'attendre le chargement de toute mon image pour que je puisse consulter d'autres liens.

    Merci

  9. #9
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Par défaut
    Aucune idée. Ca ne dépend que du navigateur : ce n'est pas PHP ou Apache qui va donner l'autorisation au navigateur de pouvoir sur un autre lien. En revanche, ça peut être ton code HTML, et surtout JavaScript : si tu appelles un code JavaScript dans l'attribut <body onload="...">, le code JavaScript ne sera effectivement appelé que lorsque la page (HTML + fichiers attachés comme les images, CSS, etc.) sera entièrement chargée, donc si tu crées tes liens avec un tel code JavaScript, ils ne seront cliquables que lorsque toute ta page (donc ton image de 1 Mo) sera chargée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. méthode getid pour afficher mes images
    Par akab48 dans le forum Langage
    Réponses: 11
    Dernier message: 17/08/2011, 00h45
  2. Réponses: 2
    Dernier message: 09/04/2009, 11h22
  3. Réponses: 2
    Dernier message: 09/08/2008, 13h30
  4. Besoin d'aide pour positionner mes images svp
    Par shubakas dans le forum Mise en page CSS
    Réponses: 7
    Dernier message: 19/05/2008, 17h17
  5. Protéger mes images
    Par Franck2mars dans le forum Webdesign & Ergonomie
    Réponses: 16
    Dernier message: 27/06/2005, 11h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo