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。它进入外部参数数组,就像BucketKey

但如果你想支持多种内容类型而不事先知道具体的类型,则需要使用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 上传访问

JavaScript 使用预签名 URL 保存到 S3

AWS 预签名 URL

如何使用 amazon sdk 为虚域生成预签名的 Amazon S3 url?

由于授权,无法访问 S3 预签名 URL [重复]