2012-09-30 16 views
8

Los usuarios de mi aplicación cargan sus archivos en un solo depósito. ¿Cómo puedo asegurarme de que cada objeto en mi cubo S3 tenga una clave única para evitar que se sobrescriban los objetos?Amazon S3 creando claves únicas para cada objeto

En este momento estoy encriptando nombres de archivos con una cadena al azar en mi script php antes de enviar el archivo a S3.

Por el bien de la discusión, supongamos que el cargador encuentra una forma de manipular el nombre del archivo al cargarlo. Él quiere reemplazar todas las imágenes en mi sitio con una imagen de banana. ¿Cuál es una buena manera de evitar sobrescribir archivos en S3 si falla el cifrado?

Editar: No creo que el versionado funcione porque no puedo especificar un ID de versión en una URL de imagen cuando se muestran imágenes de mi bucket.

Respuesta

3

¿Está encriptando o hash? Si está utilizando hashes md5 o sha1, un atacante podría encontrar fácilmente una colisión hash y hacer que se resbale sobre una piel de plátano. Si está encriptando sin un vector de inicialización aleatorio, un atacante podría deducir su clave después de cargar unos pocos cientos de archivos, y el cifrado probablemente no sea el mejor enfoque. Es computacionalmente costoso, difícil de implementar, y puede obtener un mecanismo más seguro para este trabajo con menos esfuerzo.

Si antepone una cadena al azar a cada nombre de archivo, utilizando una fuente de entropía razonablemente confiable, no debería tener ningún problema, pero debe verificar si el archivo ya existe de todos modos. Aunque codificar un ciclo para verificar, usando S3::GetObject, y generar una nueva cadena aleatoria puede parecer mucho esfuerzo para algo que casi nunca será necesario ejecutar, "casi nunca" significa que tiene una alta probabilidad de ocurrir eventualmente.

+0

¡Gracias por responder! Estoy encriptando a una cadena aleatoria. Supongo que comprobar si el archivo ya existe es la mejor solución, incluso si realizo una solicitud S3 adicional. O si almaceno toda la información del archivo en una base de datos, puedo verificar la tabla db con mysql. – CyberJunkie

+1

Como mencioné anteriormente, encriptar el nombre del archivo no es la solución más efectiva. Puede reemplazar el nombre con una cadena aleatoria y almacenar las asignaciones en su base de datos. Mira 'openssl_random_pseudo_bytes()'. –

+2

@TerenceJohnson, "casi nunca" puede ser "arbitrariamente improbable" al agregar más bits aleatorios. Hacer un viaje extra a S3 va a perjudicar su tiempo de servicio. – Fantius

0

Buscar un archivo con ese nombre antes de cargarlo funcionaría.

Si el archivo ya existe, vuelva a aleatorizar el nombre del archivo y vuelva a intentarlo.

+11

Se puede crear un archivo con ese nombre después de haber comprobado y antes de haber ingresado sus datos. Es decir, las dos operaciones no están en una transacción. – ivant