使用预签名URL上载到Amazon S3时限制对象的大小

Kod*_*der 28 amazon-s3 amazon-web-services

我知道使用这种方法限制对象的上传大小:http://doc.s3.amazonaws.com/proposals/post.html#Limiting_Uploaded_Content

但我想知道如何在服务器端使用S3 SDK作为IAM用户生成预签名URL时如何完成.

来自SDK的此Url在其参数中没有此选项:http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property

在这里:http: //docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getSignedUrl-property

请注意:我已经知道这个答案:AWS S3预先签名的URL内容长度,它不是我想要的.

use*_*568 9

V4签名协议提供了在签名中包含任意标头的选项.请参阅:http: //docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html 因此,如果您事先知道确切的内容长度,则可以将其包含在签名的URL中.根据CURL的一些实验,如果您发送的内容超过Content-Length标头中指定的数量,S3将截断该文件.以下是签名中带有多个标题的示例V4签名 http://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html

  • 但是,如果您发送的数据少于标头中指定的数据,会发生什么情况?请求是否被接受,如果是,S3 上的内容长度是否更新? (5认同)

Jan*_*ena 6

对于最终在此线程上的任何其他漫游者 - 如果您在从客户端发送请求时设置 Content-Length 属性,则有几种可能性:

  1. Content-Length 自动计算,S3 每个文件最多可存储 5GB

  2. Content-Length 由您的客户端手动设置,这意味着将发生以下三种情况之一:

  • Content-Length 与您的实际文件大小相匹配,S3 会存储它。
  • 内容长度小于您的实际文件大小,因此 S3 将截断您的文件以适应它。
  • Content-Length 大于您的实际文件大小,您将收到 400 Bad Request

在任何情况下,恶意用户都可以覆盖您的客户端并手动发送带有他们想要的任何标头的 HTTP 请求,包括比您预期大得多的内容长度。签名 URL 并不能防止这种情况发生!唯一的方法是设置 POST 策略。官方文档在这里:https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-HTTPPOSTConstructPolicy.html

更多详细信息请参见:https://janac.medium.com/sending-files-directly-from-client-to-amazon-s3-signed-urls-4bf2cb81ddc3 ?postPublishedType=initial

或者,您可以使用 Lambda 自动删除大于预期的文件。

  • 您用来创建签名的工具必须被破坏,因为它在签名中不包含 ContentLength。建议您查看亚马逊文档,了解如何在签名中包含标头。 (2认同)

kix*_*orz 5

您可能无法事前限制内容上传大小,特别是考虑POSTMulti-Part上传。您可以用来AWS Lambda创建事后解决方案。您可以设置一个Lambda函数来接收来自S3存储桶的通知,让该函数检查对象大小并让该函数删除对象或执行其他操作。

以下是有关 使用 AWS Lambda 处理 Amazon S3 事件的一些文档。

  • 对于任何不明白的人:“术语 ex-ante(有时写为 ex ante 或 exante)是一个短语,意思是“事件发生之前””。 (14认同)