Я пытаюсь защитить свой сценарий загрузки PHP-изображений, и последнее препятствие, которое я должен выполнить, заключается в том, что пользователи не могут напрямую исключать изображения, но сервер все равно может обслуживать их на веб-страницах. Я попытался изменить права собственности и права доступа к папкам безрезультатно, поэтому я пытаюсь сохранить изображения выше public_html и отображать их на страницах, которые хранятся в public_html.
Моя файловая структура:
- userimages image.jpg image2.jpg - public_html filetoserveimage.html
Я попытался привязать изображение к папке userimages следующим образом:
<img src="../userimages/image.jpg">
Но это не работает. Что-то мне здесь не хватает? Если у вас есть предложения, пожалуйста, дайте мне знать. Я пытаюсь заставить публичных пользователей выполнять потенциально опасные файлы, которые они могли загрузить. Также как дополнительная мера безопасности. Благодаря!
Вы хотите чего-то, что в принципе невозможно.
Способ загрузки страницы браузером (в основном смысле):
Шаг 1: Загрузите страницу. Шаг 2: проанализируйте страницу. Шаг 3. Загрузите все, что указано в содержании страницы (изображения, таблицы стилей, javascripts и т. Д.).
Каждое событие «Загрузка» является атомарным.
Похоже, вы хотите показывать изображения только тем, кто только что загрузил страницу, которая ссылается на эти изображения.
Как иллюстрирует PHP Jedi, вы можете передавать файлы через PHP. Вы можете расширить его код и проверить HTTP_REFERER на запрос, чтобы люди не хватали «просто» изображение.
Теперь использование каждого изображения с помощью скрипта passthru PHP неэффективно, но оно может работать.
Наиболее распространенная причина, по которой люди хотят это сделать, – избегать «hotlinking» – когда люди создают теги изображений на других сайтах, которые ссылаются на изображение на вашем сервере. Когда они это делают, вы тратите ресурсы на обработку запросов, которые отображаются на чужой странице.
Если это то, чего вы действительно пытаетесь избежать, вы можете использовать mod_rewrite для проверки реферирования.
Здесь можно найти приличное обсуждение hotlinking / anti-hotlinking
Используйте сценарий ретрансляции изображений!
Чтобы обслуживать файл образа, который находится за пределами папки 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, но его absolutley важно проверить входной параметр …
теперь вы можете сделать <img src="image-relay.php?img=flower.jpg">
чтобы получить изображение flower.jpg, которое находится в /myimage/flower.jpg …
Ну, веб-браузер будет иметь доступ только к файлам и папкам внутри public_html.
Если каталог public_html
является корнем сервера для ваших пользователей, Apache не может обслуживать ничего, что не находится внутри / ниже этой доректории.
Если вы хотите, чтобы файл был напрямую обработан Apache, вам придется поместить его в / ниже public_html
.
Я думаю, ваше недоразумение заключается в том, что если вы включаете изображение в <img>
, ваш браузер отправит тот же запрос на веб-сервер для его получения, который будет отправлен на веб-сервер, если вы попытаетесь открыть src
url изображения в вашем браузере напрямую.
Поэтому либо обе вещи работают, либо нет.
Существуют хаки, связанные с сценарием (php или другим), чтобы убедиться, что IP-адрес, который запросил изображение, также запросил html-страницу за последние несколько секунд (что не будет работать, если пользователь находится за прокси-сервером, который вращает исходящие IP) или путем проверки реферирования (который не работает с HTTP, а также нет, если пользователь отключил референт).
Если вы хотите удостовериться, что только некоторые пользователи могут видеть изображение (как через <img>
и напрямую), вы можете поместить изображение за пределы public_html и иметь (php или другой) скрипт, который проверяет учетные данные пользователя перед тем, как показывать изображение ,
Если вы используете Apache или lighttpd, вы можете использовать заголовок X-Sendfile для отправки файлов, которые не находятся в корневом каталоге веб-сайта (при условии, что вы не изменили конфигурацию файла mod_xsend).
Чтобы узнать больше о X-sendfile, см. Этот сайт .
Это решение дает вам наилучшую производительность, поскольку PHP не отправляет файл, но сервер делает, и поэтому PHP может быть удален во время работы файлов.
Надеюсь, это поможет.