Создание безопасного сервера хостинга файлов для PDF-файлов

Я работаю над созданием веб-сайта, который позволяет клиентам регистрироваться и просматривать различные PDFs сохраненные на сервере. Эти PDF-файлы будут уникальными для клиента и не должны быть доступны кому-то, кто не вошел в систему. Получение файлов на сервере не должно быть проблемой, я просто не уверен, как обслуживать их для конечных пользователей.

Я реализовал такие вещи, когда данные из SQL servers обслуживаются вместо файлов, поэтому я не совсем уверен, какой самый эффективный способ это сделать.

Веб-сайт находится на LAMP и мой минимальный опыт – в PHP (но если структура или другой язык упростит это, я смогу его изучить).

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

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

Пример PHP:

 <?php session_start(); if (!isset($_SESSION['authenticated'])) { exit; } $file = '/path/to/file/outside/www/secret.pdf'; header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . basename($file)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); ob_clean(); flush(); readfile($file); exit; ?> 

Легкий способ – предоставить этим файлам длинные случайные имена файлов (например, 20 случайных символов). Технически они будут доступны для всех, но не удастся угадать URL-адрес, поэтому доступ к ним будут иметь только уполномоченные люди.

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

Джон опубликовал первичный правильный способ сделать это, поэтому я добавляю альтернативу (возможно, хуже): подавайте ее из базы данных. Просто введите столбец BLOB для PDF и прочитайте / сохраните данные файла из базы данных. У вас будет довольно большой стол, но он будет работать. Для этого требуется установить тот же header() что и Джон, вы просто отправляете данные из БД, а не из файла.

Это имеет то преимущество, что вам не нужно, чтобы у вас не было конфликтов имен файлов и т. Д.