Хранение и чтение изображений выше public_html - PullRequest
3 голосов
/ 12 сентября 2009

Я пытаюсь обезопасить свой скрипт загрузки изображений PHP, и последнее препятствие, которое я должен преодолеть, - это сделать так, чтобы пользователи не могли напрямую выполнять изображения, но сервер все еще может обслуживать их на веб-страницах. Я попытался изменить владельца и права доступа к папкам безрезультатно, поэтому я пытаюсь сохранить изображения над public_html и отображать их на страницах, которые хранятся в public_html.

Моя структура файлов:

 - userimages
   image.jpg
   image2.jpg

 - public_html
   filetoserveimage.html

Я попытался создать ссылку на изображение в папке userimages следующим образом:

<img src="../userimages/image.jpg">

Но это не работает. Есть что-то, чего я здесь не хватает? Если у вас есть предложения лучше, пожалуйста, дайте мне знать. Я пытаюсь помешать публичным пользователям запускать потенциально опасные файлы, которые они, возможно, загрузили. Просто в качестве дополнительной меры безопасности. Спасибо!

Ответы [ 6 ]

4 голосов
/ 13 сентября 2009

Вы хотите что-то, что в принципе невозможно.

То, как браузер загружает страницу (в простом смысле), таково:

Шаг 1: Загрузите страницу. Шаг 2: разбор страницы. Шаг 3. Загрузите все, что указано в содержимом страницы (изображения, таблицы стилей, javascripts и т. Д.)

Каждое событие «Скачать» является атомарным.

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

Как показал PHP Jedi, вы можете передавать файлы через PHP. Вы можете расширить его код и проверить HTTP_REFERER в запросе, чтобы убедиться, что люди не "берут" изображение.

Теперь обработка каждого изображения с помощью PHP-сценария неэффективна, но может работать.

Самая распространенная причина, по которой люди хотят это сделать, - избегать «горячей ссылки» - когда люди создают теги изображений на других сайтах, которые ссылаются на изображение на вашем сервере. Когда они это делают, вы тратите ресурсы на обработку запросов, представленных на чужой странице.

Если это то, чего вы действительно пытаетесь избежать, вы можете использовать mod_rewrite для проверки реферера.

Приличное обсуждение горячей / анти-горячей ссылки можно найти здесь

3 голосов
/ 13 сентября 2009

Используйте сценарий ретрансляции изображений!

Чтобы обслужить файл изображения, находящийся вне папки public_html, вам придется сделать это с помощью php-скрипта. Например, сделайте image-relay.php, который читает изображение, находящееся за пределами общедоступного html ...

<?php
header('Content-Type: image/jpeg');
$_file = 'myimage.jpg'; // or $_GET['img']
echo file_get_contents('/myimages/'.$_file);
?>

Теперь $ _file может быть параметром $ _GET, но его абсолютная важность важна для проверки входного параметра ...

теперь вы можете сделать <img src="image-relay.php?img=flower.jpg"> для доступа к изображению flower.jpg, которое находится в /myimage/flower.jpg ...

1 голос
/ 13 сентября 2009

Если вы используете Apache или lighttpd, вы можете использовать заголовок X-Sendfile для отправки файлов, которые не находятся в корневом веб-каталоге (при условии, что вы не изменили конфигурацию mod_xsendfile).

Чтобы узнать больше о X-sendfile, посетите этот сайт .

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

Надеюсь, это поможет.

1 голос
/ 13 сентября 2009

Я думаю, что ваше недоразумение заключается в том, что если вы включите изображение в тег <img>, ваш браузер отправит веб-серверу точно такой же запрос на получение, который будет отправлен веб-серверу, если вы попытаетесь откройте src URL изображения в вашем браузере напрямую.

Поэтому либо обе вещи работают, либо нет.

Есть хаки, включающие (php или другой) скрипт, чтобы убедиться, что IP, который запросил изображение, также запросил html-страницу в течение последних нескольких секунд (что не будет работать, если пользователь находится за прокси-сервером). который вращает исходящие IP-адреса) или путем проверки реферера (который не работает с HTTP, а также, если у пользователя отключен реферер).

Если вы хотите убедиться, что только некоторые пользователи могут видеть изображение (как с помощью тега <img>, так и напрямую), вы можете поместить изображение вне public_html и иметь скрипт (php или другой), который проверяет учетные данные пользователя перед обслуживающий изображение.

1 голос
/ 13 сентября 2009

Если каталог public_html является корнем сервера для ваших пользователей, Apache не может обслуживать ничего, что находится не внутри / под этой директорией.

Если вы хотите, чтобы файл обслуживался Apache напрямую, вам нужно поместить его в / ниже public_html.

1 голос
/ 13 сентября 2009

Хорошо, веб-браузер сможет получить доступ только к файлам и папкам внутри public_html.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...