Proteger los directorios públicos de Linux

1

Sólo para una breve descripción. Tengo un sistema que puede generar facturas y un sistema de inicio de sesión para que un usuario genere sus facturas. Digamos que la plataforma reside en /platform y las facturas en /platform/invoices y la plataforma está en el dominio www.exmaple.com . Las personas pueden iniciar sesión y generar sus facturas, lo que genera efectivamente la factura en la carpeta invoices y luego, a través de la url www.example.com/invoices/invoicename.pdf , descarga el archivo. La carpeta de facturas es de acceso público para permitir que el sistema tome el archivo.

Sin embargo, si, por ejemplo, clientA navega a www.example.com/invoices/invoicename-ownedbyclientB.pdf , podrá descargar una factura que no le pertenece.

Ciertamente puedo hacer cosas para mitigar esto, como eliminar la factura después de la generación y las descargas para mantener la carpeta limpia, no permitir el índice en los directorios para detener la navegación fácil, cambiar el sistema para que los archivos se envíen por correo electrónico en lugar de descargarlos un directorio del sistema.

En el lado del sistema, puedo limitar fácilmente a qué personas tienen acceso, ya que están autenticadas, pero cuál sería la mejor manera de lidiar con la situación anterior. He considerado usar htaccess o similar en este directorio para asegurar que las llamadas se originen desde el propio servidor (no he comprobado si esto es posible, solo una suposición en este momento).

    
pregunta The Humble Rat 17.03.2016 - 10:39
fuente

2 respuestas

1

Está exponiendo el archivo en el directorio al usuario para que lo descargue, por lo que htaccess no funcionará, ya que todo lo que podría hacer es verificar el referente, lo que podría ser fácilmente falsificado.

La forma limpia sin la autorización del usuario es tener una tabla de búsqueda de nombres de archivos que podría parecerse a la siguiente:

+----------------------------------+
| Field            | Type          |
+------------------+---------------+
| file_id          | char(64)      |
| file_name        | varchar(100)  |
| expiration_date  | timestamp     |
+------------------+---------------+

El campo file_id es una cadena elegida al azar. Esta cadena se expone al usuario como URL de descarga. Internamente, puede almacenar el archivo en un lugar al que no se puede acceder desde Internet. Además, puede deshabilitar el acceso al archivo después de un período de tiempo definido en expiration_date . Si el tiempo ha expirado, simplemente puede eliminar el enlace de la tabla. Esto haría la enumeración mucho más difícil.

Si desea volver a ofrecer la descarga después de la expiración, puede agregar un campo adicional como download_token y vincular el tiempo de caducidad a este token. Luego podría volver a emitir el token y definir una nueva fecha de caducidad.

Hay muchas mejoras y variaciones en esto, pero espero que tengas la idea básica. Si realmente desea estar seguro, vincule una autorización y una tabla de búsqueda user_file a la descarga.

    
respondido por el Noir 17.03.2016 - 12:38
fuente
1

Cree una subcarpeta como / platform / invoices / useridclientA /. Y almacene las facturas del cliente en esta subcarpeta en particular.

No permitir más la navegación a esta carpeta directamente a través de las URL del servidor como https://www.example.com/platform/invoices/* .

Cree un script del lado del servidor (e..g PHP) que validará el ID de usuario de ClientA y leerá los únicos archivos clientA en el sistema de archivos y le permitirá descargarlos.

Opcionalmente, puedes aleatorizar aún más los nombres de archivos al generar facturas.

    
respondido por el Sravan 17.03.2016 - 12:32
fuente

Lea otras preguntas en las etiquetas