Estamos trabajando en una aplicación web, donde (entre otras características) nuestros usuarios pueden cargar sus archivos. Sin embargo, no podemos almacenar estos archivos en nuestro VPS porque el espacio de almacenamiento es limitado, por lo que decidimos usar S3.
El principal problema es que debemos asegurarnos de que los usuarios solo puedan acceder a sus propios datos. Por lo tanto, mantenemos la lista de archivos en nuestra base de datos y la lista de usuarios que tienen acceso a ellos. Nuestro servidor puede decidir fácilmente si un usuario tiene o no acceso a un archivo. Pero, ¿cómo servir realmente los archivos a los usuarios?
Hay algunas posibilidades que ya he considerado, sin embargo, ninguna de ellas parece ser la mejor.
1. Generando (caducando) URL firmadas con PHP
Este es un enfoque realmente simple, también es rápido pero da como resultado URL muy, muy feas y largas.
Aquí te explicamos cómo hacerlo .
2. URL ofuscadas
Este medio, que mantienen al público archivos de lectura en S3, pero todos los archivos se almacenan en difícil de adivinar como carpetas con el nombre: 24fa0b8ef0ebb6e99c64be8092d3ede20000
. Sin embargo, quizás esta no sea la forma más segura de hacerlo. Incluso si nunca puede adivinar el nombre de una carpeta, después de saberlo (porque realmente tiene acceso a él), puede compartir ese enlace con cualquier persona (con cualquier persona no autorizada).
3. Descargue los archivos a través de nuestro servidor
Esto significa que los archivos no son servidos directamente por S3, pero primero nuestro servidor los lee de forma segura y los sirve. Realmente no queremos esto :)
4. Referencia de comprobación
La solución de URLs ofuscadas puede mejorarse "asegurándose" de que la solicitud proviene de nuestro servidor (puede configurar S3 para verificar el referente). Sin embargo, esta sería una solución poco confiable, porque no todos los navegadores envían los datos de referencia, y también pueden ser falsificados.
¿Cuál es una buena manera de servir archivos de Amazon S3 de forma segura para diferentes clientes?