Назад | Перейти на главную страницу

Защита изображений от прямого доступа путем проверки текущего сеанса PHP с помощью mod_rewrite

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

Решение, которое я ищу, (я думаю) должно быть связано с Apache. Я видел интересное решение с использованием RewriteMap и RewriteRule, однако в примере использовалось размещение этого в файле .htaccess в каталоге PDF. Невозможно сделать это с Apache (ошибка: RewriteMap здесь не допускается). Я считаю, что директивы перезаписи должны быть в моем httpd.conf, к которому у меня есть доступ.

Итак, пример, который я нашел (который привел к «rewritemap not allowed here»), находится здесь:

RewriteEngine On
RewriteMap auth prg:auth.php
RewriteRule (.*) ${auth:$1}

auth.php просто проверяет сеанс PHP и при необходимости перенаправляет на сценарий входа.

Я читаю, что мне нужно поместить это в свой httpd.conf. Как мне указать, что RewriteMap должен появляться только в определенном каталоге (включая подкаталоги)?

Я бы, наверное, справился с этим, используя RewriteRule вместо RewriteMap. Создайте правило mod_rewrite, которое перенаправляет запросы pdf в файл php

RewriteEngine on
RewriteRule ^(.*\.pdf)$ /path/to/auth.php?i=$1

Затем вы можете настроить auth.php для аутентификации сеанса и вывода фактического содержимого PDF-файла. Я сделал то же самое, используя файлы RewriteRule и jpg.

RewriteRule ^([^thumb].*\.[jJ].*)$ /auth.php.php?i=$1

Затем я использую auth.php для изменения изображения на основе сеанса и других факторов, а затем возвращаю его клиенту. Например:

$last_modified = gmdate('D, d M Y H:i:s T', filemtime ($image));
header("Last-Modified: $last_modified");
header("Content-Type: image/jpeg");
imagejpeg($image,NULL,95);

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

Вы можете заключить эти директивы в любой <Location /directory> блок (если вы хотите сопоставить URI) или <Directory /var/www/html/directory> блок (если вы хотите сопоставить путь файловой системы).

Или вы можете просто изменить часть рисунка RewriteRule чтобы соответствовать только желаемому пути URI:

RewriteRule (^/directory.*) ${auth:$1}