s3 预签名 POST 中未强制执行内容类型

Tra*_*nes 6 post amazon-s3 pre-signed-url aws-sdk

我目前正在使用 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);
});
Run Code Online (Sandbox Code Playgroud)

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

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

很明显,我可以做一些这样的事情,但不清楚我是否需​​要。不确定图书馆是否应该为我处理这个问题。

TLDR;我需要做什么才能使用 js sdk 通过 s3 预签名 POST 激活内容类型验证?

任何帮助将不胜感激。

Mic*_*bot 5

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

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

  • 澄清一下,我提交的表单声称内容类型是别的东西。在这种情况下,我声称它是 `text/plain` 并且上传仍然有效,我希望它不会。了解 S3/sdk 不会打开文件并实际验证您的表单声明的类型。这就是为什么我想知道它是否忽略了内容类型,或者我是否只是没有正确签署请求或其他什么。 (2认同)