pagina - putobject s3 php
¿Cómo visualizo las imágenes protegidas de Amazon S3 en mi sitio seguro usando PHP? (4)
Cuando habla de seguridad y protege los datos de usuarios no autorizados, algo es claro: debe verificar cada vez que accede a ese recurso al que tiene derecho.
Eso significa que generar una url a la que pueda acceder cualquier persona (puede ser difícil de obtener, pero aún así ...). La única solución es un proxy de imagen. Puedes hacer eso con un script php.
Hay un buen artículo del blog de Amazon que sugiere usar readfile, http://blogs.aws.amazon.com/php/post/Tx2C4WJBMSMW68A/Streaming-Amazon-S3-Objects-From-a-Web-Server
readfile(''s3://my-bucket/my-images/php.gif'');
Estoy intentando mover imágenes para mi sitio desde mi host al hosting en la nube de Amazon S3. Estas imágenes son de sitios de trabajo de clientes y no pueden ser públicamente disponibles. Me gustaría que se muestren en mi sitio preferiblemente utilizando el PHP SDK disponible de Amazon.
Hasta ahora he podido guiar la conversión para buscar registros en mi base de datos, tomar la ruta del archivo, nombrarla apropiadamente y enviarla a Amazon.
//upload to s3
$s3->create_object($bucket, $folder.$file_name_new, array(
''fileUpload'' => $file_temp,
''acl'' => AmazonS3::ACL_PRIVATE, //access denied, grantee only own
//''acl'' => AmazonS3::ACL_PUBLIC, //image displayed
//''acl'' => AmazonS3::ACL_OPEN, //image displayed, grantee everyone has open permission
//''acl'' => AmazonS3::ACL_AUTH_READ, //image not displayed, grantee auth users has open permissions
//''acl'' => AmazonS3::ACL_OWNER_READ, //image not displayed, grantee only ryan
//''acl'' => AmazonS3::ACL_OWNER_FULL_CONTROL, //image not displayed, grantee only ryan
''storage'' => AmazonS3::STORAGE_REDUCED
)
);
Antes de copiar todo, he creado un formulario simple para hacer la carga de prueba y la visualización de la imagen. Si subo una imagen usando ACL_PRIVATE, puedo tomar la url pública y no tendré acceso, o puedo tomar la url pública con una clave temporal y puedo mostrar la imagen.
<?php
//display the image link
$temp_link = $s3->get_object_url($bucket, $folder.$file_name_new, ''1 minute'');
?>
<a href=''<?php echo $temp_link; ?>''><?php echo $temp_link; ?></a><br />
<img src=''<?php echo $temp_link; ?>'' alt=''finding image'' /><br />
Usando este método, ¿cómo funcionará mi almacenamiento en caché? Supongo que cada vez que actualizo la página o modifico uno de mis registros, volveré a dibujar esa imagen, aumentando mis solicitudes de obtención.
También consideré usar políticas de cubos para permitir solo la recuperación de imágenes de ciertos referentes. ¿Entiendo correctamente que se supone que Amazon solo obtiene solicitudes de páginas o dominios que especifico?
Me referí a: https://forums.aws.amazon.com/thread.jspa?messageID=188183𭼗 para configurarlo, pero luego estoy confundido sobre qué seguridad necesito en mis objetos. Parecía que si los hacía privados todavía no se mostrarían, a menos que use el enlace temporal como se mencionó anteriormente. Si los hiciera públicos, podría navegar hacia ellos directamente, independientemente de la referencia.
¿Estoy lejos de lo que trato de hacer aquí? ¿Esto no es realmente compatible con S3, o me estoy perdiendo algo simple? He revisado la documentación del SDK y he investigado mucho y creo que esto debería estar un poco más claramente documentado, así que espero que cualquier aportación aquí pueda ayudar a otros en esta situación. He leído a otros que nombran el archivo con una identificación única, creando seguridad a través de la oscuridad, pero eso no va a ser suficiente en mi situación, y probablemente no sea la mejor práctica para cualquiera que intente estar seguro.
La mejor manera de servir sus imágenes es generar una url utilizando el PHP SDK. De esta manera, las descargas van directamente de S3 a tus usuarios.
No necesita descargar a través de sus servidores como lo sugirió @mfonda, puede configurar los encabezados de almacenamiento en caché que desee en los objetos S3, y si lo hiciera, estaría perdiendo algunos de los principales beneficios del uso de S3.
Sin embargo, como señaló en su pregunta, la URL siempre cambiará (en realidad, la cadena de consulta) para que los navegadores no almacenen en caché el archivo. Lo fácil es simplemente usar siempre la misma fecha de caducidad para que siempre se genere la misma cadena de consulta. O mejor aún, almacene en caché la URL usted mismo (por ejemplo, en la base de datos) y vuelva a utilizarla siempre.
Obviamente tendrá que establecer el tiempo de caducidad en algún lugar muy lejano en el futuro, pero puede regenerar estas URL de vez en cuando, si lo prefiere. por ejemplo, en su base de datos se almacenaría la url generada y la fecha de caducidad (también se podría analizar desde la url). Entonces, o bien solo usa la url existente o, si la fecha de caducidad ha pasado, genera una nueva. etc ...
Puede descargar los contenidos de S3 (en un script PHP) y luego servirlos usando los encabezados correctos.
Como un ejemplo aproximado, digamos que tiene lo siguiente en image.php
:
$s3 = new AmazonS3();
$response = $s3->get_object($bucket, $image_name);
if (!$response->isOK()) {
throw new Exception(''Error downloading file from S3'');
}
header("Content-Type: image/jpeg");
header("Content-Length: " . strlen($response->body));
die($response->body);
Luego, en tu código HTML, puedes hacer
<img src="image.php">
Puede usar políticas de depósito en su depósito de Amazon para permitir que el dominio de su aplicación acceda al archivo. De hecho, incluso puede agregar su dominio de desarrollo local (por ejemplo: mylocaldomain.local) a la lista de acceso y podrá obtener sus imágenes. Amazon proporciona políticas de categorías de muestra aquí: http://docs.aws.amazon.com/AmazonS3/latest/dev/AccessPolicyLanguage_UseCases_s3_a.html . Esto fue muy útil para ayudarme a servir mis imágenes.
La siguiente política resolvió el problema que me llevó a este SO:
{
"Version":"2008-10-17",
"Id":"http referer policy example",
"Statement":[
{
"Sid":"Allow get requests originated from www.example.com and example.com",
"Effect":"Allow",
"Principal":"*",
"Action":"s3:GetObject",
"Resource":"arn:aws:s3:::examplebucket/*",
"Condition":{
"StringLike":{
"aws:Referer":[
"http://www.example.com/*",
"http://example.com/*"
]
}
}
}
]
}