Контроль доступа к файловой системе с помощью PHP

Я ранее разместил здесь:

Управление доступом для пробной подписки

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

Я думаю, что решение, с которым я собираюсь управлять доступом, состоит в том, чтобы загрузить файл и хэшировать имя. Файл будет в формате:

/uploads/#############.pdf

Ссылка будет отправлена ​​подписчикам. Когда они впервые приходят на сайт, их попросят создать "булавку" и "подсказку" для запоминания. Затем можно получить доступ к целевой странице, чтобы перечислить их элементы с помощью адреса электронной почты / пин-код.

У меня такой вопрос: я знаю, что могу контролировать доступ к странице, которая показывает, какие элементы они могут просматривать, но есть ли способ контролировать /uploads/[файл], чтобы его можно было загружать только после некоторой программной проверки? Я не могу придумать, как это сделать....

Еще раз спасибо. D.

1 ответ

Решение

Ваши PDF-файлы не обязательно должны находиться в каталоге, доступном для просмотра пользователем. Они могут быть вне вашего корня сети. Таким образом, никто не может на самом деле просматривать www.yoursite.ext/uploads/2395wrfhgt.pdf скачать его самому или поделиться ссылкой с другими.

Чтобы скачать pdf, у вас будет специальный скрипт, который будет выполнять все проверки доступа для пользователя, который его запрашивает, и, если все в порядке, он установит соответствующие заголовки, прочитает файл из файловой системы и распечатает его в Пользователь.

Итак, скажем, ваш сайт находится на /var/www/site/htdocs/ и вы загружаете каждый PDF в /var/www/site/uploads/, Вам даже не нужно хэшировать имена файлов, но вместо этого вы можете сохранить их названия для легкой организации.

Затем все ссылки для скачивания файла будут указывать на www.yoursite.ext/download.php?id={fileid}

Ваш download.php выполнит все проверки доступа (правильно вошел в систему, имеет права на загрузку файла и т. Д.), А затем сделает следующее:

$pathToPdf = '/var/www/site/uploads/some.pdf' ;

header('Content-Type: application/pdf');
header('Content-Length: ' . filesize($pathToPdf));
header('Content-Disposition: attachment; filename=' . 'some.pdf');

readfile($pathToPdf) ;

И это в значительной степени так. Как только вы это заработаете, вы сможете улучшить некоторые вещи:

  • используйте mod_rewrite или аналогичный файл, чтобы в ссылке было указано фактическое имя файла pdf, что помогает некоторым браузерам понять, что они должны его скачать: www.yoursite.ext/download/{fileid}.pdf
  • рассмотрите возможность использования веб-сервера вместо php для обслуживания файлов, например, заголовок X-Sendfile
Другие вопросы по тегам