php - 用于提供图像的临时 S3 存储桶 URL
问题描述
使用“aws/aws-sdk-php”:“^3.0@dev”
我正在创建一个图像共享网站,但不希望人们将我的 URL 复制到另一个站点以窃取我的内容/带宽。
我最初将对象存储为
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。
//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,这可能与您有关:
如果您的网站具有登录功能,您可以在提供预签名 url 之前检查身份验证逻辑。
如果没有,您可以使用 Http Referrer(可以被欺骗)。或者一个 api 密钥(比如在 API Gateway 中)
推荐阅读
- azure - 如何以编程方式降级和升级 Azure 虚拟机
- github - 如何自定义 Github profile repo 的样式?
- javascript - 当状态通过父项更改时更新子项
- oracle - Oracle 截断表后恢复 Clob 数据
- java - 部署后如何维护 javafx 桌面应用程序
- python - 从 StringIO 中删除行
- c++ - 为什么 C++ 标准字符串复制比字符串移动更快?
- selenium - 如何识别具有附加页面名称的相同 URL 的元素的 xpath
- python - 如何以最佳权重保存张量流模型
- endpoint - Wireguard 配置文件中的 Endpoint 和 AllowedIPs 字段有什么区别?