2010-08-11 3 views
2

Я создаю онлайн-сервис, где «специальные пользователи» могут загружать свои изображения. Очень важно, чтобы изображения не подвергались никому другому, кроме пользователя, который их загрузил. Я слышал, что лучший способ защитить изображения состоит в том, чтобы поместить их в веб-интерфейс.Получить контент (изображения) сверху webscope

Пока все хорошо.

Моя проблема в том, что я не могу отображать изображения, как это делается? Приложение написано в PHP и структуру каталогов, как это:

 
    /     # this is where i placed the images 
    /www 
    /www/domain.com/  # This is the root of the website 

Я мириться testscript для получения изображений с помощью этого кода

 
    header('Content-type: image/jpeg'); 
    $image = imagecreatefromjpeg(realpath('../../image.jpg')); 
    imagejpeg($image); 
    imagedestroy($image); 

, который выдает изображение на файл, который отображает его

 
    <img src="retrieve-image.php" /> 

Может ли кто-нибудь сказать мне, что я делаю неправильно? Может ли быть установлен php.ini неправильно? Есть ли более простой способ защитить изображения?

Спасибо заранее!

// Матиас Бак

P.S. Как написать код в моем сообщении надлежащим образом?

ответ

1

Вы собираетесь получить изображение неправильно. Нет причин, по которым вы должны декодировать JPEG в необработанное растровое изображение в памяти (imagecreatefromjpeg(), которое может сосать ОГРОМНЫЙ объем памяти, если исходное изображение велико), повторно сжимать его (imagejpeg() со всеми потерями и накладными расходами процессора, что сопровождается это), когда все, что вам нужно сделать, это скопировать байты.

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

Ваш просмотр сценарий будет иметь что-то вроде этого:

<img src="retrieve-image.php?imageID=123" /> 

И retrieve-image.php будет выглядеть так:

<?php 

function is_user_allowed_to_see($imageID) { 
    // figure out if user is allowed to see the specified image 
} 

if (is_user_allowed_to_see_this($_GET['imageID'])) { 
    readfile("/www/uploads/domain.com/" . $_GET['imageID']); 
} else { 
    readfile("/www/domain.com/sorry-not-allowed.jpg"); 
} 

readfile() является предпочтительным способом потокового файла пользователю через PHP. Он позаботится о том, чтобы прочитать содержимое файла и отправить его в браузер в кусках, которые не будут превышать лимит памяти сценария.

Поскольку вы загружаете данные изображения непосредственно в тег <img>, вы не можете выводить текст «извините, не разрешено видеть этот», поскольку это будет недопустимое изображение, и вы просто получите значок сломанной картинки. Таким образом, если пользователь не разрешен, отправьте изображение, содержащее текст/изображение (скажем, красный разрезанный круг), чтобы сказать это вместо фактического изображения.

+0

Спасибо за ваш ответ и за код readfile(), но он все равно не работает :(Когда я вывожу $ _SERVER ['DOCUMENT_ROOT'], он печатает **/home/www/domai n.com/**. Я поместил изображение в папку «home», которая находится поверх webscope. Я написал readfile (realpath ("../../ image.jpg")); но это не показывает никакого изображения. Любые другие предложения? P.S. Я бы оценил вас, если бы мог, но у меня недостаточно очков –

0

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

+0

У меня есть механизм входа, но если кто-то просто входит в «http://domain.com/path/to/image/image.jpg ", будет показано, что он вошел в систему или нет. Это мое беспокойство ... –

+0

В этом случае вам нужно сохранить изображения в базе данных, а не просто создавать изображения в вашем веб-пространстве. – Thariama

+0

Спасибо за быстрый ответ! Я мог бы это сделать, но db-трафик будет дорогим для тома, который я собираюсь использовать, так что, к сожалению, это не вариант –

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