Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Администрирование Web серверов и Web служб > Apache запрет на картинку


Автор: Axotnik 31.3.2011, 12:52
Добрый день, уважаемые! У меня в каталоге есть пхп-скрипт и картинка. Пхп-скрипт  выводит картинку  в браузер.
Вопрос - как можно запретить прямой доступ к картинке с адресной строки браузера, но оставить возможность показывать картинку через пхп-скрипт? 
Пример: картинка - http://mysite.ru/img/img1.jpg ; пхп-скрипт - http://mysite.ru/img/my.php.
Если перейти через http://mysite.ru/img/my.php, то картинка должна отображаться, если на прямую http://mysite.ru/img/img1.jpg то  нет.

Заранее благодарю.

Автор: Wolf1994 31.3.2011, 14:16
1. Установить права на папку, не позволяющие обращаться к ней извне, но достаточные для доступа скриптом.
2. Скопировать в папку файл .htaccess с командами:
Код

RewriteEngine On
RewriteRule ^.+\.jpg$ /page404.html [L,NS]
#где page404.html - страница с сообщением об ошибке.

или:
Код

RewriteEngine On
RewriteRule ^.+\.jpg$ - [F] [L,NS]
#что должно привести к запрету на доступ к папке по HTTP

Автор: Axotnik 31.3.2011, 16:00
А какие именно права нужны для папки?
А когда создаю файл .htaccess, доступ к картинке запрещен, но она также не отображается и через скрипт.
Код

<?php
echo "<img oncontextmenu=\"return false\" src=\"img1.jpg\" alt=\"\" />";
?


Автор: Wolf1994 31.3.2011, 16:26
Точно не знаю, но, кажется, права на публичный доступ к файлу и на чтение его процессом Apache, запущенным с определёнными привилегиями, отличаются. Можно найти это отличие опытным путём.

Верно: приведённый пример блокирует любой доступ к файлам по HTTP. Если нужно сделать так, чтобы при обращении к графическому файлу он передавался на обработку скрипту, то можно использовать такой .htaccess:

Код

RewriteEngine On
RewriteRule ^(.+\.jpg)$ - /my.php?img=$1 [L,NS]
#при обращении к любой картинке откроется скрипт /my.php,
#в котором переменная $_GET ["img"] будет содержать URL картинки.

...Либо можно обращаться непосредственно к PHP скрипту, используя полную блокировку файлов с расширением "JPEG". В таком случае вышеприведённые примеры запрещения доступа по HTTP не повлияют на чтение файла скриптом.

Автор: Nigel 31.3.2011, 16:44
Либо используйте механизм x-sendfile, тогда физическое расположение файлов может быть любым, либо делайте запрет как показали выше, читая саму картинку при этом php скриптом.

Автор: Axotnik 31.3.2011, 17:55
а можно пример, а то что б не пробовал - все равно не отображается.

Автор: Wolf1994 31.3.2011, 18:31
Скрипт не отображает картинку при запросе "http://mysite.ru/img/my.php", после добавления ".htaccess", но до этого этот же скрипт нормально её выводил?

Автор: Axotnik 1.4.2011, 09:42
да. до этого норм.

Автор: Wolf1994 1.4.2011, 09:51
Цитата(Axotnik @  31.3.2011,  16:00 Найти цитируемый пост)
А когда создаю файл .htaccess, доступ к картинке запрещен, но она также не отображается и через скрипт.

echo "<img oncontextmenu=\"return false\" src=\"img1.jpg\" alt=\"\" />";


Не отображается при использовании этого HTML кода?

Автор: Axotnik 1.4.2011, 10:53
да

Автор: Wolf1994 1.4.2011, 11:00
Понятно.

В таком случае, вопрос может быть решён с помощью проверки источника обращения к файлу:

Код

RewriteEngine On
RewriteCond %{HTTP_REFERER} !my\.php [NC]
RewriteRule ^.+\.jpg$ - [F]


100% защиты это не даст, но задачу решит.

Автор: Axotnik 1.4.2011, 11:07
задачу не решает. При обращении http://mysite.ru/img/img1.jpg к картинке картинка отображается. 
Через скрипт тоже отображается. 

Автор: Wolf1994 1.4.2011, 13:29
Данные инструкции были помещены в пустой файл ".htaccess" в папке "img":

Код

RewriteEngine On
RewriteCond %{HTTP_REFERER} !my\.php [NC]
RewriteRule ^.+\.jpg$ - [F]


После чего через адресную строку браузера был запрошен файл "img/img1.jpg" и файл "img/my.php" и в обоих случаях картинка загрузилась?

Автор: Axotnik 1.4.2011, 14:04
да

Автор: Wolf1994 1.4.2011, 15:51
Ясно.

Приведённый последним пример должен был заблокировать картинку при обращении не из скрипта "my.php". Видимо, где-то в данном коде допущена ошибка. Можете попробовать использовать этот подход: проверку на HTTP_REFERER для "JPEG" файлов и составить более корректный ".htaccess".

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)