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

时间:2014-09-23 09:16:11

标签: amazon-web-services amazon-s3

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

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

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 Pre-signed URL content-length并且它不是我想要的。

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

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

以下是一些文档 Handling Amazon S3 Events Using the AWS Lambda

答案 2 :(得分:0)

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

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

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

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

在任何情况下,恶意用户都可以覆盖您的客户端并手动发送带有他们想要的任何标头的 HTTP 请求,包括比您预期的要大得多的 Content-Length。签名的 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 自动删除比预期大的文件。