2014-02-08 2 views
2

У меня есть защищенный паролем каталог (с .htaccess) на моем сайте, содержащий * .jpg файлы. Я не хочу, чтобы кто-либо мог напрямую обращаться к этим .jpg, но я хочу, чтобы php-скрипт отображал файлы * .jpg. Возможно ли подобное?Как просматривать изображения из защищенной папки с помощью php?


Для тех, кто задается вопросом, почему я хочу это: У меня есть регистрационную форму, где пользователь может загрузить картинку и до окончания регистрации, он может проверить, правильно ли была загружена. На данный момент я сохраняю загруженное изображение во временном каталоге, и, если он его завершает, я перемещаю изображение в каталог, защищенный паролем. Тем не менее, мне не нравится, что в каждой регистрации происходит короткое время, когда изображение является общедоступным (например, через поисковую систему). Хуже того, когда кто-то загружает изображение, но не завершает регистрацию, изображение остается навсегда в каталоге temp, если я не удалю его каким-либо образом. Но если я установил cron-задание для удаления всех изображений во временном каталоге в течение определенного времени, возможно, что изображение someones будет удалено, если он зарегистрируется в неблагоприятный момент.

+0

Вы можете использовать robots.txt для защиты сканеров от этого каталога. И вы можете проверить на deeplinking, может помочь вам немного. – Martijn

+5

PHP не заботится о ваших конфигурациях 'htaccess' и напрямую связывается с файловой системой, если вы не пытаетесь получить файлы с другого сервера. – h2ooooooo

+0

@ h2ooooooo Если я включаю изображение, пользователь может ввести имя пользователя и пароль для моего защищенного каталога. Итак, php. заботится о моем htaccess, или я пропустил вашу мысль? – Adam

ответ

7

h2ooooooo уже ответил на мой вопрос в разделе комментариев.

Это код, как это работает, в моем коде я должен заменить

<img src='link/to/protectet/picture.jpg'> 

с

<img src='image.php'> 

и изображения.php состоят только из

<? 
header('Content-Type: image/jpeg'); 
readfile('link/to/protectet/picture.jpg'); 
?> 

это сработало. Благодарю.

0

Я не уверен, является ли то, что вы хотите достичь, но я понимаю, что:

  1. Существует группа графических файлов, которые хранятся в .htaccess защищенного пароля папки и только зарегистрированная и аутентифицированные пользователи могут загружать файлы непосредственно в эту папку.

  2. Для вновь регистрируемого пользователя существует период времени, когда сеанс, который загрузил изображение, позволяет загружать изображение, но никакой другой сессии, независимо от того, прошла ли она аутентификация или нет, разрешено делать это.

Для того, чтобы сделать так, вы могли бы, вероятно:

  1. Как нужно различать временные образы от действительных изображений: хранение бывшего в/TEMP папки на самом деле хорошая идея, так как временные файлы никогда не будет смешиваться с действительными файлами.

  2. Для каждой сессии, которая пытается зарегистрироваться, вы, вероятно, можете назвать свой загруженный файл изображения, используя session_id() (т. Е. $name = session_id() . '.jpg'). Тогда простой скрипт (аналогичный: php, file download) может предоставить сохраненное изображение, относящееся к текущему сеансу. Этот скрипт может быть адресом источника для тега <img> в регистрационной форме.

  3. Что касается заброшенных изображений в/temp - работа cron могла бы избавиться от них. Вызывая mtime() для каждого файла, вы можете легко опустить файлы, которые были созданы слишком недавно, и поэтому они, вероятно, все еще используются.

0

Принятый ответ h2ooooooo является большим. Но что мешает кому-то печатать адрес URL-адреса для image.php и обслуживать изображение? (На самом деле, это то, что я пробовал, и я, к сожалению, смог получить изображение, даже если оно находится в папке, защищенной паролем.)

Кажется, нам нужен способ определения того, что запрос поступает со страницы на том же веб-сайте или, возможно, установить переменную сеанса до этого вызова и проверить ее существование перед тем, как показывать изображение. Есть хорошие предложения для этого here: How to check if a request if coming from the same server or different server?

я в конечном итоге делаю следующее (<img src="getUploadFile.php?fname=my.jpg">):

<? 

function requestedByTheSameDomain() { 
    $myDomain  = $_SERVER['SCRIPT_URI']; 
    $requestsSource = $_SERVER['HTTP_REFERER']; 

    return parse_url($myDomain, PHP_URL_HOST) === parse_url($requestsSource, PHP_URL_HOST); 
} 

if(requestedByTheSameDomain()) { 
    $inputArr = array(); 
    if($_SERVER["REQUEST_METHOD"] == 'POST') { 
     $inputArr = $_POST; 
    } 
    else { 
     $inputArr = $_GET; 
    } 
    $fname = $inputArr['fname']; 
    $path_info = pathinfo($fname); 
    $ext = $path_info['extension']; 

    if (in_array($ext, array('jpg','png','gif','jpeg','bmp','tif','tiff'))) { 
     $type = 'image'; 
     $subType = $ext; 
     if($ext == 'jpg') $subType = 'jpeg'; 
     if($ext == 'tif') $subType = 'tiff'; 
     if($ext == 'svg') $subType = 'svg+xml'; 
    } 
    else if(in_array($ext, array('mpg','ogg'))) { 
     $type = 'audio'; 
     $subType = $ext; 
    } 
    else if($ext == 'mp4'){ 
     $type = 'video'; 
     $subType = $ext; 
    } 
    else if($ext == 'pdf') { 
     $type = 'application'; 
     $subType = $ext; 
    } 

    header("Content-Type: $type/$subType"); 
    readfile("images/$fname"); 
} 
?> 

Все, что остается, чтобы отключить правую кнопку мыши и/или служить ему фоновое изображение для отображения Сохранить-Image-Как сложно.

+0

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

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