Ограничить размер объектов при загрузке в Amazon S3 с использованием предварительно подписанного URL

Я знаю об ограничении размера загрузки объекта с помощью этого метода: http://doc.s3.amazonaws.com/proposals/post.html

Но я хотел бы знать, как это можно сделать при создании предварительно подписанного URL-адреса с использованием S3 SDK на стороне сервера в качестве пользователя IAM.

Этот URL из SDK не имеет такой опции в своих параметрах: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html

Ни в этом: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html

Обратите внимание: я уже знаю об этом ответе: AWS S3 Длина подписанного URL-адреса, и это НЕ то, что я ищу.

4 ответа

Протокол подписи V4 предлагает возможность включать произвольные заголовки в подпись. См.: http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html Таким образом, если вы заранее знаете точную длину содержимого, вы можете включить ее в подписанный URL-адрес., Основываясь на некоторых экспериментах с CURL, S3 будет обрезать файл, если вы отправите больше, чем указано в заголовке Content-Length. Вот пример подписи V4 с несколькими заголовками в подписи http://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html

Для любых других странников, которые попадают в этот поток - если вы установите атрибут Content-Length при отправке запроса от вашего клиента, есть несколько возможностей:

  1. Content-Length рассчитывается автоматически, и S3 будет хранить до 5 ГБ на файл.

  2. Content-Length устанавливается вашим клиентом вручную, что означает, что произойдет один из этих трех сценариев:

  • Content-Length соответствует вашему фактическому размеру файла, и 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

В качестве альтернативы у вас может быть лямбда, которая автоматически удаляет файлы, размер которых превышает ожидаемый.

Возможно, вы не сможете ограничить размер загружаемого контента, особенно с учетом POST а также Multi-Part добавления. Вы могли бы использовать AWS Lambda создать решение ex-post. Вы можете настроить Lambda функция для получения уведомлений от S3 ведите, пусть функция проверяет размер объекта, а функция удаляет объект или выполняет какое-то другое действие.

Вот некоторая документация по обработке событий Amazon S3 с помощью AWS Lambda.

Вы можете указать минимальный и максимальный размеры в байтах, используя условие, называемоеcontent-length-range:

      {
  "expiration": "2022-02-14T13:08:46.864Z",
  "conditions": [
    { "acl": "bucket-owner-full-control" },
    { "bucket": "my-bucket" },
    ["starts-with", "$key", "stuff/clientId"],
    ["content-length-range", 1048576, 10485760]
  ]
}
Другие вопросы по тегам