Контроль доступа к файловой системе с помощью 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