Sie müssen keine Dateien auf Amazon S3 öffentlich machen (standardmäßig sind sie es nicht). Sie können jedoch spezielle Schlüssel generieren, um den Zugriff auf private Dateien zu ermöglichen. Diese Schlüssel werden über die URL übergeben und können so eingestellt werden, dass sie ablaufen.
<?php
if(!function_exists('el_crypto_hmacSHA1')){
/**
* Calculate the HMAC SHA1 hash of a string.
*
* @param string $key The key to hash against
* @param string $data The data to hash
* @param int $blocksize Optional blocksize
* @return string HMAC SHA1
*/
function el_crypto_hmacSHA1($key, $data, $blocksize = 64) {
if (strlen($key) > $blocksize) $key = pack('H*', sha1($key));
$key = str_pad($key, $blocksize, chr(0x00));
$ipad = str_repeat(chr(0x36), $blocksize);
$opad = str_repeat(chr(0x5c), $blocksize);
$hmac = pack( 'H*', sha1(
($key ^ $opad) . pack( 'H*', sha1(
($key ^ $ipad) . $data
))
));
return base64_encode($hmac);
}
}
if(!function_exists('el_s3_getTemporaryLink')){
/**
* Create temporary URLs to your protected Amazon S3 files.
*
* @param string $accessKey Your Amazon S3 access key
* @param string $secretKey Your Amazon S3 secret key
* @param string $bucket The bucket (bucket.s3.amazonaws.com)
* @param string $path The target file path
* @param int $expires In minutes
* @return string Temporary Amazon S3 URL
* @see http://awsdocs.s3.amazonaws.com/S3/20060301/s3-dg-20060301.pdf
*/
function el_s3_getTemporaryLink($accessKey, $secretKey, $bucket, $path, $expires = 5) {
// Calculate expiry time
$expires = time() + intval(floatval($expires) * 60);
// Fix the path; encode and sanitize
$path = str_replace('%2F', '/', rawurlencode($path = ltrim($path, '/')));
// Path for signature starts with the bucket
$signpath = '/'. $bucket .'/'. $path;
// S3 friendly string to sign
$signsz = implode("\n", $pieces = array('GET', null, null, $expires, $signpath));
// Calculate the hash
$signature = el_crypto_hmacSHA1($secretKey, $signsz);
// Glue the URL ...
$url = sprintf('http://%s.s3.amazonaws.com/%s', $bucket, $path);
// ... to the query string ...
$qs = http_build_query($pieces = array(
'AWSAccessKeyId' => $accessKey,
'Expires' => $expires,
'Signature' => $signature,
));
// ... and return the URL!
return $url.'?'.$qs;
}
}
?>
Verwendung
<?php echo el_s3_getTemporaryLink('your-access-key', 'your-secret-key', 'bucket-name', '/path/to/file.mov'); ?>
Sie sollten den echten Autor erwähnen, wenn Sie meinen Code hier einfügen.
Ohne weitere Umschweife... die Originalquelle dieses Schnipsels ist
5ubliminal's Amazon S3 Expiring Link Builder.
Danke!
Großartig, danke für den Hinweis. Ich versuche immer, das zu tun. Ich habe diese Funktion für mich gesucht, sie auf Snipplr gefunden, und es war nicht klar, wer der ursprüngliche Autor war, also habe ich nur die Seite gutgeschrieben, auf der ich sie gefunden habe.
Was hindert jemanden daran, den Bildschirm zu aktualisieren und eine neue URL zu erhalten? Ich dachte, AWS wäre in der Lage, eine sichere URL bereitzustellen, aber kurz gesagt, wenn man nicht die PHP-API lernt, gibt es keine Möglichkeit, Inhalte sicher zu liefern?
Vielen Dank für dieses Skript. An euch beide.
Nichts, aber dann läuft dieser NEUE Link nach der Zeitbegrenzung auch ab. Der Punkt ist, dass man, um einen nützlichen Link zur Datei zu haben, diese bestimmte Seite aufrufen muss, da der Link sonst ziemlich nutzlos ist.
Chris,
Können Sie bitte detailliertere Anweisungen für einen PHP-Noob wie mich geben?
Ich habe folgende Fragen
a) Wo platziere ich die erste Datei?
b) Wie benenne ich sie?
c) Wo genau würde ich die 2. Box platzieren, die Sie hier zeigen?
d) Kann der Bösewicht meine Access Key usw. sehen, wenn er diese Seite öffnet?
Danke.
Ihre Art, alles in diesem Artikel zu erklären, ist tatsächlich gut, jeder
kann es mühelos verstehen, vielen Dank. http://shop-computer.
info Erstens, für jeden einzelnen Laden. Versuchen Sie, das Produkt oder die Dienstleistung zu finden, die ersetzt werden soll durch etwas, das Sie normalerweise verwenden?
Sanjay Khatri
Hier finde ich die richtige Lösung, ohne Zeit zu verschwenden...
Schöne Anleitung.. Weiter so...
5***** Sterne
tray
Also, gibt es eine funktionierende Version? Und wenn nicht, könnte jemand das in ein funktionierendes WordPress-Plugin verwandeln? :)
searbe
„GET\n\n\n1378560058\n/path/to/file“
ist.
Dieser String wird verwendet, um einen *binären* sha1-hmac zu erzeugen, der base64-codiert sein sollte. Es erscheint seltsam, die hmac-Generierung manuell durchzuführen (ich gehe davon aus, dass der ursprüngliche Code für ältere PHP-Versionen war) – das Folgende ist eine prägnantere Methode, um dasselbe zu tun
was die gleiche Verwendung hätte
Ich mag Ihren Schnipsel, aber würde diese Methode immer noch funktionieren, wenn die herunterladbare Datei groß ist und die URL abläuft, während der Download läuft, bevor die Datei vollständig heruntergeladen ist?
Ich habe nur 1 Zweifel... was, wenn ich möchte, dass die URL für immer gültig ist, d.h. sie nicht abläuft oder man sagt, sie hat eine unendliche Ablaufzeit?
Dann können Sie den S3-Link einfach öffentlich machen. Das gibt den Benutzern unbegrenzten Zugriff auf die S3-Dateien. Der Blogbeitrag zielte darauf ab, diesen unbegrenzten Zugriff durch die Erstellung einer vorab signierten URL einzuschränken.
Hallo,
Gibt es jemanden, der mir helfen kann, die oben genannten beiden Funktionen in c# zu schreiben? Ich habe sehr wenig Kenntnisse über PHP und versuche, dasselbe in der .NET-Welt zu erstellen.
Danke im Voraus,
Anuruddha
Großartig!
Gibt es eine Möglichkeit, eine benutzerdefinierte Fehlerseite anzuzeigen, wenn diese abgelaufen sind? Soweit ich das beurteilen kann, kann man das nur tun, wenn man die Webhosting-Optionen in der S3-Konsole verwendet. Bei Verwendung dieser funktioniert der Ablaufcode hier nicht.