Wie kann ich geschützte Amazon S3-Bilder auf meiner sicheren Website mit PHP anzeigen?
Ich versuche Bilder für meine Website von meinem Rechner auf Amazon S3-cloud-hosting. Diese Bilder sind von client-Arbeit-sites und ist nicht öffentlich zugänglich. Ich möchte, dass Sie angezeigt werden, auf meiner Website vorzugsweise mit das PHP-SDK von Amazon erhältlich.
Bisher habe ich in der Lage, ein Skript für die Konvertierung, so dass ich nach oben schauen Datensätze in meiner Datenbank, schnappen Sie sich den Pfad der Datei, benennen Sie es entsprechend aus und senden es an Amazon zu stellen.
//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
)
);
Bevor ich kopieren alles vorbei ist, habe ich eine einfache form zu tun, test-upload und Anzeige des Bildes. Wenn ich ein Bild hochladen mit ACL_PRIVATE, kann ich entweder greifen Sie die öffentliche url, und ich werde nicht zugreifen, oder ich greifen kann die öffentliche url mit einem temporären Schlüssel und können das Bild anzuzeigen.
<?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 />
Mit dieser Methode, wie wird mein caching funktioniert? Ich vermute, dass jedes mal, wenn ich die Seite aktualisieren oder ändern einer meiner Platten, die ich mir ziehen, dass die Bild wieder, steigt meine Anfragen bekommen.
Ich habe auch überlegt mit bucket-Richtlinien, sodass nur Bild-retrieval, von bestimmten referrers. Verstehe ich richtig, dass Amazon soll lediglich die fetch-Anfragen von Webseiten oder domains, die ich angeben?
Ich verwiesen:
https://forums.aws.amazon.com/thread.jspa?messageID=188183𭼗 zu stellen, aber dann bin verwirrt, als die Sicherheit, die ich brauche auf meine Objekte. Es schien, wie wenn ich Sie Privat würden Sie noch nicht angezeigt, es sei denn, ich benutzt das temp-link, wie zuvor erwähnt. Wenn ich Sie der öffentlichkeit, ich konnte navigieren direkt zu Ihnen, unabhängig von referrer.
Bin ich Weg, was ich versuche, hier zu tun? Ist das nicht wirklich unterstützt vom S3, oder bin ich etwas fehlt einfach? Ich bin in der SDK-Dokumentation und viele suchen, und so fühlen sollte, ein wenig mehr klar dokumentiert, so dass hoffentlich keine Eingabe-hier können anderen helfen in dieser situation. Ich habe gelesen, andere, die den Namen der Datei mit einer eindeutigen ID, erstellen von security through obscurity, aber das wird nicht schneiden Sie es in meiner situation, und wahrscheinlich nicht das beste für jeden, der versucht, sicher zu sein.
InformationsquelleAutor der Frage Bob | 2011-03-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der beste Weg, um zu dienen Ihre Bilder zu generieren, eine url mit dem PHP-SDK. So die downloads gehen direkt von S3 an Ihre Benutzer.
Brauchen Sie nicht zum download über Ihre Server, da @mfonda vorgeschlagen - können Sie eine beliebige caching-Header, die Sie gerne auf S3-Objekte - und wenn du getan hast, würden Sie verlieren einige wichtige Vorteile der Verwendung von S3.
Jedoch, wie Sie schon in Ihrer Frage, die url immer ändern (eigentlich der querystring) so Browsern nicht Zwischenspeichern der Datei. Das leicht umgehen, ist einfach immer das gleiche Ablaufdatum, so dass die gleichen querystring wird immer generiert. Oder, noch besser, 'cache' die url selbst (z.B. in der Datenbank) und verwenden Sie es jedes mal.
Erhalten Sie natürlich haben, um den Ablauf der Zeit, irgendwo weit in der Zukunft, aber Sie regenerieren kann diese urls jeder so oft, wenn Sie bevorzugen. zB in der Datenbank, die Sie speichern Sie die generierte url und das Ablaufdatum(man könnte analysieren, die von den url auch). Dann entweder verwenden Sie einfach die bestehende url oder, wenn das Ablaufdatum verstrichen ist, einen neuen zu generieren. etc...
InformationsquelleAutor der Antwort Geoff Appleford
Können Sie die bucket-Richtlinien in Ihrem Amazon-Eimer, damit Ihre Anwendung die domain auf die Datei zugreifen. In der Tat, können Sie sogar fügen Sie Ihre lokalen dev-Domäne (ex: mylocaldomain.lokal) in der access-Liste und Sie werden in der Lage sein, um Ihre Bilder. Amazon bietet sample-bucket-Richtlinien hier: http://docs.aws.amazon.com/AmazonS3/latest/dev/AccessPolicyLanguage_UseCases_s3_a.html. Das war sehr hilfreich, mir zu helfen, dienen meine Bilder.
Die nachfolgende Richtlinie das problem, dass gebracht mich zu diesem Thema SO:
InformationsquelleAutor der Antwort Wes
Wenn Sie sprechen über die Sicherheit und den Schutz der Daten vor dem Zugriff Unbefugter, etwas ist klar: Sie müssen überprüfen, jedes mal, wenn Sie Zugriff auf die Ressource, dass Sie berechtigt sind.
Das bedeutet, dass die Erzeugung eines url zugegriffen werden kann von jedermann (könnte schwierig zu beschaffen sein, aber trotzdem...). Die einzige Lösung ist ein image-proxy. Sie können tun, dass mit einem php-Skript.
Gibt es einen feinen Artikel aus der Amazon-blog, dass sugests mit readfile, http://blogs.aws.amazon.com/php/post/Tx2C4WJBMSMW68A/Streaming-Amazon-S3-Objects-From-a-Web-Server
InformationsquelleAutor der Antwort catalinux
Herunterladen können Sie den Inhalt von S3 (in einem PHP-Skript), dann servieren Sie Sie mit dem richtigen Header.
Als einfaches Beispiel, sagen, Sie hätten die folgenden in
image.php
:Dann in deinen HTML-code, die Sie tun können,
InformationsquelleAutor der Antwort mfonda