2010-11-18 5 views
0

J'ai une page PHP appelé test.php sur lequel je créer un lien vers une image dynamique appelée image.php comme suit:Bloc accès direct à dynamique PHP-Image

echo "<img src=\"image.php?ID=abc&X=123\" align=\"absmiddle\" style=\"margin:5px;\"><br>"; 

Le fichier image prend ID et X en tant que paramètres GET et les utilise pour include une image statique existante de mon serveur. Un en-tête est envoyé indiquant au serveur d'interpréter le fichier en jpeg.

Je veux empêcher les utilisateurs d'être en mesure de tirer l'image en visitant http://mydomain.com/image.php?ID=/abc&X=123, tout en permettant à cette image à afficher dans test.php et d'autres pages sur mon serveur. Comment puis-je accomplir cela? Jusqu'ici, j'ai essayé plusieurs types de mods et de réécritures, dont le plus proche de mes préoccupations est the one shown on this page. Rien n'a fonctionné; aidez s'il vous plaît!

+0

Merci à tous pour votre contribution. Alors que vos réponses me mettent dans la bonne direction, la solution sur cette page est exactement ce dont j'avais besoin: http://bit.ly/fN2RSN – mukduk

Répondre

2

Ce n'est pas possible, car ce que fait votre navigateur pour afficher l'image est accès direct.

Il y aura beaucoup de conseils sur l'analyse HTTP_REFERER, mais ce sera une mauvaise décision, car cet en-tête est facultative et dans plusieurs circonstances, il peut être cutted hors de pare-feu, antivirus, proxy, etc.

+0

J'ai trouvé la solution de ce site assez efficace: http://bit.ly/fN2RSN – mukduk

+0

@ romanusfatuus: cela ne résout pas les problèmes que j'ai décrits dans ma réponse. Rien d'intéressant là-bas. La meilleure chose à faire est de vérifier (dans .htaccess, bien sûr, ** pas dans php **) que le referer existe et est égal au domaine actuel ou n'existe pas du tout. C'est le bon compromis je pense. – zerkms

+0

Merci beaucoup! Je vais incorporer cette mesure. – mukduk

0

I): utiliser des sessions

test.php:

<?php 
session_start(); 
//.... 
$_SESSION["allow_images"]="yes"; 
echo "<img src=\"image.php?ID=abc&X=123\" align=\"absmiddle\" style=\"margin:5px;\"><br>"; 
?> 

image.php:

<?php 
session_start(); 

if(isset($_SESSION["allow_images"]) { 
    // render image 
    unset($_SESSION["allow_images"]); 
} else { 
    // throw error/ show dummy image /etc 
} 
?> 

II) Deuxième solution (non à toute épreuve):

intérieur image.php

$ref=$_SERVER["HTTP_REFERER"]; 
if($ref == "http://yoursite.com/path/test.php") { 
    // get image parameters and render image 
} else { 
    // throw error or maybe render a dummy image with just few bytes 
}; 

Notez que HTTP_REFERER peut facilement être usurpée.


Un peu plus tôt une mauvaise solution:

Utiliser les variables dans test.php

$allow_image="yes"; 
echo "<img src=\"image.php?ID=abc&X=123\" align=\"absmiddle\" style=\"margin:5px;\"><br>"; 

et de test pour isset ($) allow_images à image.php avant de rendre. Aurait travaillé seulement si image.php a été inclus comme romanusfatuus a souligné.

+0

Cela ne fonctionnerait que si je devais inclure l'image dans 'test.php', lui donnant accès au code contenant. Malheureusement, pour autant que je sache, 'image.php' ne peut pas voir ou même déterminer l'existence de' $ allow_image_access' comme je souhaite le référencer. – mukduk

+0

Désolé, les variables ne fonctionnent que si vous "incluez" le fichier. Mais quelque chose dans ce sens devrait fonctionner. –

+0

True. HTTP_REFERER est une autre façon, bien que ce ne soit pas infaillible. –

Questions connexes