Ограничить размер объектов при загрузке в 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 при отправке запроса от вашего клиента, есть несколько возможностей:
Content-Length рассчитывается автоматически, и S3 будет хранить до 5 ГБ на файл.
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]
]
}