Безопасная работа с изображениями

Задача
Необходимо контролировать, кто может просматривать набор изображений.

Решение
Не храните изображения в корневом каталоге документов, а запишите их куда-нибудь в другое место. Чтобы предоставить файл для просмотра, откройте его вручную и пошлите броузеру:

header('Content-Type: image/png');
readfile('/path/to/graphic.png');

Обсуждение
Первая строка в разделе «Решение» посылает броузеру заголовок Content-type, поэтому броузер знает тип прибывающего объекта и отображает его соответствующим образом. Вторая строка открывает файл на диске (или с удаленного URL) для чтения, читает его, выгружает его прямо в броузер и закрывает файл.

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

Один из способов – базовая аутентификация HTTP, которой посвящен рецепт 8.9.
Однако типичный способ не всегда самый лучший. Скажем, что произойдет, если необходимо ограничить список файлов, доступных для просмотра, а усложнение работы применением имен пользователей и паролей нежелательно? Один из вариантов состоит в том, чтобы создать ссылки на файлы – если пользователи не могут щелкнуть по ссылке, то они не могут и просмотреть файл.


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

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

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


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

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

// показываем комикс, если он не старше 14 дней и не относится
// к будущим комиксам
// вычисляем текущую дату
list($now_m,$now_d,$now_y) = explode(',',date('m,d,Y'));
$now = mktime(0,0,0,$now_m,$now_d,$now_y);
// двухчасовая граница, чтобы учесть dst
$min_ok = $now - 14*86400 - 7200; // 14 дней назад
$max_ok = $now + 7200; // сегодня
// определяем временную метку запрашиваемого комикса
$asked_for = mktime(0,0,0,$_REQUEST['mo'],$_REQUEST['dy'],$_REQUEST['yr']);
// сравниваем даты
if (($min_ok > $asked_for) || ($max_ok < $asked_for)) {
echo 'You are not allowed to view the comic for that day.';
} else {
header('Content-type: image/png');
readfile("/www/comics/$_REQUEST['mo']$_REQUEST['dy']
$_REQUEST['yr'].png");
}

Оцените статью: (0 голосов)
0 5 0

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

Вернуться в раздел: PHP / 15. Графика