【问题标题】:Content Type not enforced in s3 pre-signed POSTs3 预签名 POST 中未强制执行内容类型
【发布时间】:2019-01-26 21:05:18
【问题描述】:

我目前正在使用 AWS javascript SDK 来创建预签名的 POST。 (请注意,这个问题不是关于预签名的 PUT/URL,另一个 s3 功能)

https://github.com/aws/aws-sdk-js/

在尝试创建预签名帖子时,我会执行以下操作:

const params = {
  Bucket: 'myuniques3bucket',
  Fields: {
    Key: 'key1.png',
    'Content-Type': 'image/png'
  },
  conditions: [
    {bucket: 'myuniques3bucket'},
    {key: 'key1.png'},
    {'Content-Type': 'image/png'},
    ['content-length-range', 1024, 1048576], // 1KB to 10MB
    {'x-amz-date': amzDate},
    {'x-amz-algorithm': 'AWS4-HMAC-SHA256'},
    {'x-amz-credential': `${process.env.AWS_ACCESS_KEY_ID}/20180820/us-east-2/s3/aws4_request`}
  ],
  Expires: 300  // 300 seconds
}

s3.createPresignedPost(params, (err, data) => {
  console.log(data);
});

我正在围绕不应该工作的上传过程进行测试。我发现那里没有强制执行内容类型,因为我可以使用其他内容类型的帖子参数上传其他文件类型。

我不清楚 JS SDK 是否为用户管理签名过程,或者我是否需要做一些特殊的事情来获取签名中的这些不同的密钥。

很明显,我可以做到这一点,但不清楚是否需要。不确定图书馆是否应该为我处理。

TLDR;我需要做些什么来激活使用 js sdk 的 s3 预签名 POST 的内容类型验证?

任何帮助将不胜感激。

【问题讨论】:

  • 我遇到了同样的问题,您是否设法让它工作

标签: post amazon-s3 aws-sdk pre-signed-url


【解决方案1】:

策略文档仅指定表单字段必须包含的内容,以便 S3 接受签名请求为有效——在这种情况下,表单必须声明内容类型是image/png 以便 S3 将使用 Content-Type: image/png 存储对象。这种机制实际上并不验证对象本身的内容类型。 S3 没有这样做的方法,JS SDK 也没有。

您可以在浏览器的 JS 中执行此操作,也可以在上传后执行此操作,使用 S3 事件通知后台进程需要验证上传的内容。无论如何,对图像进行后处理可能是一种很好的做法,因为您经常希望去除任何不适当的元数据,例如某些图像中包含的用于识别照片拍摄位置的数据。

【讨论】:

  • 澄清一下,我提交的表单声称内容类型是别的东西。在这种情况下,我声称它是text/plain,并且上传仍然有效,我希望它不会。了解 S3/sdk 不会打开文件并实际验证表单声明的类型。这就是为什么我想知道它是否忽略了内容类型,或者我只是没有正确签署请求或其他什么。
  • 有趣。那应该是不可能的。对象呢?如果您在上传后在控制台中检查它,您会看到什么内容类型?
  • 我注意到了同样的行为:只要form 提供了一个名为Content-Type 的字段以及策略所需的值,S3 就会接受该文件,无论其内容如何。跨度>
【解决方案2】:

您可以将 S3 存储设置为仅接受某些类型的文件。 查看文档: https://aws.amazon.com/premiumsupport/knowledge-center/s3-allow-certain-file-types/

【讨论】:

  • 此链接允许您将上传的文件名限制为仅是这些扩展名。这不会检查文件的实际内容类型。例如我上传了一个扩展名为 shell-script.png 的 shell 脚本,这不会失败。
猜你喜欢
  • 1970-01-01
  • 2018-09-11
  • 2018-07-06
  • 2017-01-06
  • 1970-01-01
  • 2019-01-16
  • 1970-01-01
  • 2020-04-28
相关资源
最近更新 更多