2010-11-18 4 views
0

У меня есть PHP страница с именем test.php, на которой я связываюсь с динамическим изображением называется image.php следующим образом:Block Прямой доступ к динамическому PHP-Image

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

Файл изображения занимает ID и X как параметры GET, и использует их для include существующего статического изображения с моего сервера. Отправляется заголовок, сообщающий серверу интерпретировать файл как jpeg.

Я хочу, чтобы пользователи не могли вытащить изображение, посетив http://mydomain.com/image.php?ID=/abc&X=123, при этом разрешая просмотр этого изображения в test.php и других страницах моего сервера. Как это сделать?

До сих пор я пробовал много видов .htaccess мод и переписывает, из которых наиболее близкими к моим проблемам являются the one shown on this page. Ничего не сработало; пожалуйста помоги!

+0

Спасибо всем за ваш вклад. Хотя ваши ответы поставили меня в правильном направлении, решение на этой странице именно то, что мне нужно: http://bit.ly/fN2RSN – mukduk

ответ

2

Невозможно, так как ваш браузер должен показать изображение прямой доступ.

Там будет много советов об анализе HTTP_REFERER, но это будет дурным решения, поскольку этот заголовок не является обязательным, и в некоторых случаях это может быть резаным от брандмауэром, антивирусом, прокси и т.д.

+0

Я нашел решение этого сайта довольно эффективным: http://bit.ly/fN2RSN – mukduk

+0

@ romanusfatuus: он не решает проблем, которые я описал в своем ответе. Ничего интересного нет. Лучшее, что вы можете сделать, это просто проверить (в .htaccess, конечно, ** не на php **) либо референт существует, либо равен текущему домену или вообще не существует. Думаю, это хороший компромисс. – zerkms

+0

Большое спасибо! Я включу эту меру. – mukduk

0

I) Использование сессий:

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) Второе решение (не верный):

Внутри 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 
}; 

Обратите внимание, что HTTP_REFERER легко могут быть подменены.


Ранее неправильное решение:

Использовать переменные в test.php

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

и тестирование Исеть ($ allow_images) в image.php до рендеринга. Работал бы только в том случае, если image.php был включен как указано Romanusfatuus.

+0

Это будет работать, если я должен «включить» изображение в 'test.php', предоставив ему доступ к содержащемуся коду. К сожалению, насколько я могу судить, 'image.php' не может увидеть или даже определить существование' $ allow_image_access', как я хочу ссылаться на него. – mukduk

+0

Извините, кажется, что переменные работают, только если вы «включили» файл. Но что-то в этом направлении должно работать. – 2010-11-18 06:12:29

+0

Правда. HTTP_REFERER - это еще один способ, хотя это не является надежным. – 2010-11-18 06:44:37

Смежные вопросы