Comment puis-je afficher protégé Amazon S3 images sur mon site sécurisé à l'aide de PHP?
Je suis en train de transférer des images de mon site à partir de mon hôte à Amazon S3 d'hébergement cloud. Ces images sont du client des sites de travail et ne peut pas être accessible au public. Je voudrais qu'ils soient affichés sur mon site, de préférence en utilisant le SDK PHP disponible sur Amazon.
Jusqu'à présent j'ai été en mesure de script pour la conversion de sorte que je rechercher des enregistrements dans ma base de données, saisissez le chemin d'accès au fichier, son nom de manière appropriée, et de l'envoyer à 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
)
);
Avant que je copie tout, j'ai créé un formulaire simple à faire, test de chargement et d'affichage de l'image. Si j'upload une image à l'aide de ACL_PRIVATE, je peux soit saisir l'url publique et je n'aurai pas accès, ou je peux récupérer l'url publique avec une clé temporaire et peut afficher l'image.
<?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 />
À l'aide de cette méthode, comment mon de la mise en cache? Je devine à chaque fois que j'actualise la page, ou de modifier l'un de mes disques, je vais être en tirant à nouveau cette image, l'augmentation de mes demandes.
J'ai également étudié à l'aide de politiques de compartiment pour ne permettre l'extraction d'images à partir de certains référents. Dois-je comprends bien que Amazon est censé uniquement extraire les demandes de pages ou des domaines-je le préciser?
Que j'ai référencé:
https://forums.aws.amazon.com/thread.jspa?messageID=188183𭼗 pour le mettre en place, mais ensuite, suis confus quant à la sécurité dont j'ai besoin sur mes objets. Il semblait comme si je leur ai fait Privé, ils ne voulaient toujours pas d'affichage, à moins que j'ai utilisé le temp lien comme mentionné précédemment. Si j'ai fait le public, j'ai pu naviguer directement, indépendamment de référent.
Je suis loin de ce que je suis en train de faire ici? Ce n'est pas vraiment pris en charge par S3, ou ai-je raté quelque chose de simple? Je suis passé par la documentation du kit de développement, et de beaucoup, de la recherche et se sentir comme ce devrait être un peu plus clair et documenté, alors j'espère que toute entrée ici peut aider d'autres personnes dans cette situation. J'ai lu d'autres qui le nom du fichier avec un ID unique, la création de la sécurité par l'obscurité, mais qui ne sera pas coupé dans ma situation, et probablement pas la meilleure pratique pour ceux qui cherchent à être sécurisé.
Vous devez vous connecter pour publier un commentaire.
La meilleure façon de servir vos images est de générer une url en utilisant le SDK PHP. De cette façon, les téléchargements aller directement à partir de S3 à vos utilisateurs.
Vous n'avez pas besoin de télécharger via vos serveurs @mfonda suggéré - vous pouvez définir la mise en cache des en-têtes que vous aimez sur les objets S3 - et si vous ne vous serait de perdre certains avantages principaux de l'utilisation de la S3.
Cependant, comme vous l'avez souligné dans votre question, l'url sera toujours changeant (en fait la querystring) afin que les navigateurs ne pas mettre en cache le fichier. La solution de rechange simple est tout simplement d'utiliser toujours la même date d'expiration, de sorte que la même chaîne de requête est toujours généré. Ou, mieux encore, "cache" de l'url vous-même (par exemple dans la base de données) et de le réutiliser à chaque fois.
Vous devez évidemment avoir pour définir le délai d'expiration est quelque part loin dans l'avenir, mais vous pouvez régénérer ces url de chaque si souvent, si vous préférez. par exemple, dans votre base de données vous serait de stocker l'url générée et la date d'expiration(vous pu analyser qu'à partir de l'url). Alors soit vous suffit d'utiliser l'url existante ou, si la date d'expiration est passée, en générer un nouveau. etc...
Vous pouvez utiliser les politiques de compartiment dans votre Amazon seau pour permettre à votre domaine de l'application pour accéder au fichier. En fait, vous pouvez même ajouter vos locaux dev de domaine (ex: mylocaldomain.locale) à la liste d'accès et vous serez en mesure d'obtenir vos images. Amazon fournit des exemples de politiques de compartiment ici: http://docs.aws.amazon.com/AmazonS3/latest/dev/AccessPolicyLanguage_UseCases_s3_a.html. Cela a été très utile pour m'aider à me servir de mes images.
La politique ci-dessous résolu le problème qui m'a amené à cette SORTE de sujet:
Quand vous parlez de la sécurité et de la protection des données contre les utilisateurs non autorisés, une chose est claire: vous devez vérifier chaque fois que vous accédez à cette ressource que vous êtes en droit d'.
Cela signifie, que la génération d'une url qui peut être consulté par n'importe qui (pourrait être difficile à obtenir, mais quand même...). La seule solution est une image de proxy. Vous pouvez le faire avec un script php.
Il y a un bel article à partir d'Amazon blog qui sugests à l'aide de readfile, http://blogs.aws.amazon.com/php/post/Tx2C4WJBMSMW68A/Streaming-Amazon-S3-Objects-From-a-Web-Server
Vous pouvez télécharger le contenu à partir de S3 (dans un script PHP), puis servir en utilisant les bons en-têtes.
Rugueuse comme exemple, disons que vous avez eu de la suite dans
image.php
:Puis dans votre code HTML, vous pouvez le faire