AWS S3 PHP SDK 预签名 url 限制内容类型
Posted
技术标签:
【中文标题】AWS S3 PHP SDK 预签名 url 限制内容类型【英文标题】:AWS S3 PHP SDK presigned url restrict content type 【发布时间】:2018-09-11 18:40:33 【问题描述】:我正在尝试使用 AWS S3 php SDK 发出 PutObject 预签名请求。
我收到了工作请求,但现在我只想让我的用户只能上传视频文件。我尝试了很多组合并搜索了很多,但我无法让它工作。
这是我使用的示例代码:
$cmd = $this->s3client->getCommand('PutObject', [
'Bucket' => 'myBucket',
'Key' => 'inputs/' . $movie->getId(),
'ACL' => 'private',
'Conditions' => ['Starts-With', '$Content-Type', 'video/'], // I have tried other combinations but it seems to not work
]);
$request = $this->s3client->createPresignedRequest($cmd, '+30 minutes');
$movie->setSignedUrl((string)$request->getUri());
生成的签名网址从不包含 X-Amz-SignedHeaders 查询参数中的 Content-Type,仅包含主机。
【问题讨论】:
你试过看看这个例子吗? ***.com/questions/11621863/… 【参考方案1】:putObject()
请求没有记录在案的 Conditions
密钥。
您似乎将 S3 的 PUT
上传接口与支持 ['Starts-With', '$Content-Type', 'video/'],
等策略文档条件的 pre-signed POST
功能混淆了
PUT
不支持“以”开头。它需要 exact Content-Type
并且这个键(这应该导致标题出现在 X-Amz-SignedHeaders
查询字符串参数中)只是 ContentType
。它进入外部参数数组,就像Bucket
和Key
。
但如果你想支持多种内容类型而不事先知道具体的类型,则需要使用POST
上传。
【讨论】:
是的,我混淆了这两者。但是,我也尝试过使用 ContentType 键,但它似乎被忽略了。我在 GitHub repo 上提交了一个问题:github.com/aws/aws-sdk-php/issues/1521 回复:您在 Github 上的问题,如上所述,PUT
API 本身不支持对 Content-Type patterns 的限制,例如 video/*
。它只支持完整的值,如video/mp4
。我不同意不签署标头的架构决定,因为它似乎为了不正确使用它的人的利益而简化了代码,但即使按预期工作,它对你的目的也没有用,因为这个原因。以上是关于AWS S3 PHP SDK 预签名 url 限制内容类型的主要内容,如果未能解决你的问题,请参考以下文章
通过使用 AWS-SDK PHP 生成的预签名帖子拒绝 AWS S3 上传访问
通过使用 AWS-SDK PHP 生成的预签名帖子拒绝 AWS S3 上传访问