您不必将 Amazon S3 上的文件设为公开(默认情况下它们不是公开的)。但是,您可以生成特殊的密钥以允许访问私有文件。这些密钥通过 URL 传递,并且可以设置为过期。
<?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;
}
}
?>
用法
<?php echo el_s3_getTemporaryLink('your-access-key', 'your-secret-key', 'bucket-name', '/path/to/file.mov'); ?>
您应该在将我的代码粘贴到这里时提及真正的作者。
话不多说……这段代码的原始来源是
5ubliminal 的 Amazon S3 过期链接生成器.
谢谢!
很好,感谢您的提醒。我一直努力做到这一点。我当时在为自己寻找这个函数,在 Snipplr 上找到了它,但没有明确说明原始作者是谁,所以我只是提到了我找到它的页面。
有什么可以阻止某人刷新屏幕并获得新 URL 的方法吗?我以为 AWS 应该能够提供安全的 URL,但除了学习 PHP API 之外,有没有办法安全地传递内容?
感谢此脚本。你们两位。
没有,但新的链接也会在时间限制后过期。重点是,为了拥有一个有用的文件链接,您必须正在查看该特定页面,因为否则该链接几乎没用。
Chris,
你能否为像我这样的 PHP 新手提供更详细的说明?
有一些问题
a) 我应该把第一个文件放在哪里?
b) 我应该如何命名它?
c) 我应该把您在这里显示的第二个框放在哪里?
d) 当坏人打开该页面时,他是否能够看到我的访问密钥等信息?
谢谢。
您在这篇文章中解释所有内容的方式实际上很好,每个人
都能轻松理解,非常感谢。 http://shop-computer。
信息首先,对于每个商店。尝试查找可以
替换您通常使用的某些产品的服务?
这是一个很棒的教程……它帮助了我很多……我到处都查看过,但没有找到正确的解决方案。
在这里我找到了正确的解决方案,无需浪费时间……
不错的教程.. 保持更新……
5***** 星
这个教程的有效版本在哪里?我在 wordpress 上看到一个,但问题是如果将鼠标悬停在临时链接上,它实际上会显示访问密钥。另一个在您将鼠标悬停在其上时会显示访问密钥和密钥。
所以,有没有有效的版本?如果没有,谁能将其制作成一个可行的 WordPress 插件?:)
为了阐明这篇博文,Amazon 文档(滚动到 最后一个示例)指定用于生成签名的字符串为
“GET\n\n\n1378560058\n/path/to/file”
该字符串用于生成一个二进制 sha1-hmac,它应该进行 base64 编码。手动进行 hmac 生成似乎很奇怪(我认为原始代码是针对较旧的 PHP 版本的)——以下是一种更简洁的方法来完成相同的事情
它将具有相同的用法
我喜欢您的代码段,但是如果可下载文件很大,并且在文件下载完成之前 URL 在下载过程中过期,这种方法是否仍然有效。
我只有一个疑问……如果我想让 URL 永久有效,即它不应该过期或您可以说无限期过期时间
然后您可以简单地将 S3 链接设为公开。这将允许用户无限访问 S3 文件。这篇博文旨在通过创建预签名 URL 来限制这种无限访问。
你好,
有没有人可以帮助我用 C# 编写以上两个函数?我对 PHP 的了解很少,并且正在尝试在 .net 世界中创建相同的函数。
提前感谢,
Anuruddha
太棒了!
有没有办法设置自定义错误页面以在这些链接过期时显示?据我所知,您只能在使用 S3 控制台中的网络托管选项时执行此操作。当使用该选项时,此处的过期代码不起作用。