Php 用于提供图像的临时S3存储桶URL
使用“aws/aws sdk php”:“^3。0@dev" 我正在创建一个图像共享网站,但不希望人们将我的URL复制到另一个网站来窃取我的内容/带宽 我最初将对象存储为Php 用于提供图像的临时S3存储桶URL,php,amazon-s3,Php,Amazon S3,使用“aws/aws sdk php”:“^3。0@dev" 我正在创建一个图像共享网站,但不希望人们将我的URL复制到另一个网站来窃取我的内容/带宽 我最初将对象存储为 return $s3->putObject([ 'Bucket' => $bucket, 'Key' => $key, 'Body' => $file, 'ACL' => 'public-read', ]);
return $s3->putObject([
'Bucket' => $bucket,
'Key' => $key,
'Body' => $file,
'ACL' => 'public-read',
]);
但我已经删除了“公共阅读”,所以现在下面的URL不再有效
https://mybucket-images.s3.us-west-1.amazonaws.com/' . $key);
我需要做什么来创建一个仍然可以在客户端缓存以访问对象的临时URL
我想的一件事是每周或每月更改一次密钥,但这需要我使用cronjob更新所有对象。必须有一种方法来创建临时访问URL?如果您的目的是仅通过发布在您网站上的URL使您的内容可读,而让相同的web客户端使用从另一个网站访问的相同URL则不起作用,我想您可能会发现这相当困难。我想到的大多数方法都是相当荒谬的 我会看看这个,看看对你来说是否足够好:
如果您的目的是让您的内容仅通过发布在您网站上的URL可读,而让同一个web客户端使用从另一个网站访问的相同URL是行不通的,我想您可能会发现这相当困难。我想到的大多数方法都是相当荒谬的 我会看看这个,看看对你来说是否足够好:
使用服务器为存储桶中的密钥生成预签名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();
取自
但每次有人请求你的页面时,你都必须这样做。链接将在任何地方都有效。您只需最小化其有效期
如果您的网站是基于API的,并且您通过API检索url,这可能与您有关:
- 如果您的网站具有登录功能,则可以在提供预先签名的url之前检查身份验证逻辑
- 如果没有,您可以使用Http Referer(可以欺骗)。或api密钥(如在api网关中)
//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();
取自
但每次有人请求你的页面时,你都必须这样做。链接将在任何地方都有效。您只需最小化其有效期
如果您的网站是基于API的,并且您通过API检索url,这可能与您有关:
- 如果您的网站具有登录功能,则可以在提供预先签名的url之前检查身份验证逻辑
- 如果没有,您可以使用Http Referer(可以欺骗)。或api密钥(如在api网关中)
// initiate connection to your S3 bucket
$client = new S3Client(['credentials' => ['key' => 's3 key', 'secret' =>'s3 secrete'], 'region' => 's3 region', 'version' => 'latest']);
$object = $client->getCommand('GetObject', [
'Bucket' => 's3 bucket',
'Key' => 'images/image.png' // file
]);
$presignedRequest = $client->createPresignedRequest($object, '+20 minutes');
$presignedUrl = (string)$presignedRequest->getUri();
if ($presignedUrl) {
return $presignedUrl;//presigned URL
} else {
throw new FileNotFoundException();
}
您可以使用以下代码:
// initiate connection to your S3 bucket
$client = new S3Client(['credentials' => ['key' => 's3 key', 'secret' =>'s3 secrete'], 'region' => 's3 region', 'version' => 'latest']);
$object = $client->getCommand('GetObject', [
'Bucket' => 's3 bucket',
'Key' => 'images/image.png' // file
]);
$presignedRequest = $client->createPresignedRequest($object, '+20 minutes');
$presignedUrl = (string)$presignedRequest->getUri();
if ($presignedUrl) {
return $presignedUrl;//presigned URL
} else {
throw new FileNotFoundException();
}
谁向bucket写入—bucket权限是什么?如果你是唯一的作者,不确定问题出在哪里——假设你发布的东西不是机密的,对随机读者来说没有什么价值。我的后端会将用户上传到bucket的图像写入。所有图片都是公开的,但我想防止人们将我的S3 URL复制到另一个网站。因此,您尝试这样做,以便客户可以访问从您的网站获得的URL,但如果他们从另一个网站读取URL,则不能访问该URL?是的,我的网站将生成一个可以持续30天左右的URL,但这样会过期并要求我的站点重新生成它。谁会写入bucket-bucket权限是什么?如果你是唯一的作者,不确定问题出在哪里——假设你发布的东西不是机密的,对随机读者来说没有什么价值。我的后端会将用户上传到bucket的图像写入。所有图片都是公开的,但我想防止人们将我的S3 URL复制到另一个网站。因此,您尝试这样做,以便客户可以访问从您的网站获得的URL,但如果他们从另一个网站读取URL,则不能访问该URL?是的,我的网站将生成一个可以持续30天左右的URL,但是,然后将到期,并要求我的网站重新生成它。我相信这是我正在寻找的,谢谢!我将使链接的有效期为7天,我想。我相信这是我正在寻找的,谢谢!我将使链接的有效期为7天,我想。