Creación de un servidor de alojamiento de archivos seguro para archivos PDF

Estoy trabajando para desarrollar un sitio web que permita a los clientes iniciar sesión y ver varios PDFs guardados en el servidor. Estos archivos PDF serán únicos para el cliente y no deberían ser accesibles para alguien que no esté conectado. Obtener los archivos en el servidor no debería ser un problema, simplemente no estoy seguro de cómo servirlos a los usuarios finales.

Implementé este tipo de cosas con los datos de los SQL servers lugar de los archivos, por lo que no estoy seguro de cuál es la forma más efectiva de hacerlo.

El sitio web está en LAMP y mi experiencia mínima es en PHP (pero si un framework u otro lenguaje lo hacen más fácil, puedo aprenderlo).

Probablemente esté por encima de mi cabeza, pero normalmente lo estoy, así que cualquier aportación sería genial.

Coloque los archivos fuera de la webroot. Luego, usando PHP pasa el archivo a través de un script. De esta forma, nadie puede vincular el archivo directamente y eludir tus controles. (Naturalmente, asegúrese de que la secuencia de comandos que hace esto solo después de verificar que el usuario tiene permiso para recuperar ese archivo).

Muestra de PHP:

  

La manera más fácil es dar a estos archivos largos nombres de archivo aleatorios (por ejemplo, 20 caracteres aleatorios). Técnicamente, cualquiera podrá acceder a ellos, pero no será posible adivinar la URL, por lo que solo las personas autorizadas tendrán acceso.

Alternativamente, John Conde ya delineó una forma de servir un archivo desde un script PHP. Se incurrirá en una pequeña penalización de rendimiento, pero será tan seguro como su código. Lo único que puedo agregar es que si no puede ubicarlos fuera de webroot, entonces es posible que pueda usar .htaccess para evitar que las personas accedan a los archivos directamente.

John publicó la forma correcta primaria de hacerlo, así que estoy agregando la alternativa (probablemente inferior): Servirlo desde la base de datos. Solo tiene una columna BLOB para el PDF y lea / almacene los datos del archivo de la base de datos. Terminará con una mesa bastante grande, pero funcionará. Servirlo requiere configurar el mismo header() que John publicado, solo envía los datos de la base de datos en lugar de enviarlos desde el archivo.

Esto tiene la ventaja de no tener que garantizar que no tenga colisiones de nombres de archivo, etc.