【问题标题】:How do you enforce Content-Type in S3 pre-signed POSTs?您如何在 S3 预签名 POST 中强制执行 Content-Type?
【发布时间】:2019-09-23 22:37:52
【问题描述】:

我正在尝试为我的应用程序重新上传上传:

  1. 客户端上传文件到 API
  2. API 将文件上传到 S3

  1. 客户端从 API 请求预签名 URL
  2. API 生成并使用 URL 响应
  3. 客户端上传到 S3

我正在努力解决的一件事是限制可以上传的文件。我们希望允许上传图像和视频,但不允许上传可执行文件等潜在危险文件。我一直在尝试利用存储桶策略来强制执行 $Content-Typevideo/mp4,但我仍然能够上传图像。以下是我生成 URL 的方式(在本例中为 PHP,主要取自 S3 docs):

$formInputs = ['acl' => 'public-read', 'key' => 'test1.mp4', 'Content-Type' => 'video/mp4'];
$options = [
    ['acl' => 'public-read'],
    ['bucket' => $bucket],
    ['key' => 'test1.mp4'],
    ['eq', '$Content-Type', 'video/mp4']
];
$expires = '+2 hours';
$postObject = new \Aws\S3\PostObjectV4(
    $client,
    $bucket,
    $formInputs,
    $options,
    $expires
);

$postObject->getFormInputs() 插入 Postman 并将图像作为文件发布后,它接受上传。如果我从 S3 请求文件,我可以访问它,但是它会以 Content-Type: video/mp4 返回并且不会在浏览器中播放;但我仍然可以上传似乎没有意义的文件。

似乎这个选项只要求在表单输入中包含该字段(如果我从输入中删除 Content-Type 字段,它会失败)。 Content-Type 标头似乎完全不相关,文件的实际 mime 类型也是如此。如果是这样的话,这条规则对于 POST/PUT 来说似乎毫无用处(对于 GET 来说可能就没那么有用了)。

是否可以在不依赖表单输入中发送的数据的情况下限制允许上传的文件类型?或者我是否需要在我的应用程序或 Lambda 中上传后检查文件并验证它是否正确?

【问题讨论】:

    标签: amazon-web-services amazon-s3


    【解决方案1】:

    该政策仅控制表单中允许/要求的内容。更改/删除字段会导致错误,因为上传不再符合政策。没有验证上传的数据是否实际上是指定的Content-Type

    如果您需要验证它,您必须在事后验证它——在您的应用程序或 Lambda 中,如您所建议的那样。

    【讨论】:

    • 这就是我认为的情况。我想我将不得不单独处理它,这很烦人,但无论如何都不是世界末日。假设没有人说其他话,我会在几天后将其标记为答案。
    • 听起来不错。 S3 只关心存储数据字节,而不是解释有效负载——并且强制执行Content-Type 将要求它 S3 解释有效负载。
    • 是的,从他们的角度来看这是有道理的。只是有点讨厌我们。
    猜你喜欢
    • 2019-01-26
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多