用于投放图片的临时S3存储桶URL

时间:2018-08-22 02:45:25

标签: php amazon-s3

使用“ aws / aws-sdk-php”:“ ^ 3.0@dev”

我正在创建一个图像共享网站,但不希望人们将我的URL复制到另一个网站上来窃取我的内容/带宽。

我最初将对象存储为

return $s3->putObject([
        'Bucket' => $bucket,
        'Key'    => $key,
        'Body'   => $file,
        'ACL'    => 'public-read',
    ]);

但是我已经删除了“公共阅读”,因此下面的网址不再有效

 https://mybucket-images.s3.us-west-1.amazonaws.com/' . $key);

我需要做些什么来创建仍然可以被客户端缓存以访问对象的临时URL?

我想做的一件事是每周或每月更改一次密钥,但这需要我用cronjob更新所有对象。必须有一种创建临时访问URL的方法吗?

3 个答案:

答案 0 :(得分:1)

使用服务器为存储桶中的密钥生成预签名的URL。

//Creating a presigned request
$s3Client = new Aws\S3\S3Client([
    'profile' => 'default',
    'region'  => 'us-east-2',
    'version' => '2006-03-01',
]);

$cmd = $s3Client->getCommand('GetObject', [
    'Bucket' => 'my-bucket',
    'Key'    => 'testKey'
]);

$request = $s3Client->createPresignedRequest($cmd, '+20 minutes');
$presignedUrl = (string) $request->getUri();

取自https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/s3-presigned-url.html

但是,每当页面有请求时,您都必须这样做。链接将在任何地方都有效。您只需最小化其有效期。

如果您的网站是基于API的,并且您通过API检索了网址,那么这可能与您有关:

  • 如果您的网站具有登录功能,则可以在提供预签名的URL之前检查身份验证逻辑。

  • 如果没有,则可以使用Http Referrer(可以被欺骗)。或api键(例如在API Gateway中)

答案 1 :(得分:0)

如果您的目的是仅通过发布在您网站上的URL来使内容可读-而不是让同一个Web客户端使用从另一个站点访问的相同url无效,那么我认为您可能会发现这很困难。我想到的大多数方法都是伪造的。

我会看一看,看看它是否对您足够好:

Restricting Access to a Specific HTTP Referrer

答案 2 :(得分:0)

您可以使用以下代码:

""