Ограничение размера файла S3 PUT с использованием предварительно подписанных URL-адресов

#java #amazon-web-services #amazon-s3 #pre-signed-url

#java #amazon-веб-сервисы #amazon-s3 #предварительно подписанный url

Вопрос:

Я создаю предварительно подписанные URL-адреса S3, чтобы клиент (мобильное приложение) мог помещать изображение непосредственно в S3 вместо прохождения службы. Для моего варианта использования время истечения срока действия предварительно подписанного URL-адреса должно быть настроено на более длительное окно (10-20 минут). Поэтому я хочу ограничить размер загрузки файлов в S3, чтобы любой злоумышленник не мог загружать большие файлы в корзину S3. Клиент получит URL-адрес от службы, которая имеет доступ к корзине S3. Я использую AWS Java SDK.

Я обнаружил, что это можно сделать с помощью почтовых форм для загрузки в браузер, но как я могу это сделать, используя только что подписанный URL-адрес S3 PUT?

Комментарии:

1. Недоступно с предварительно подписанными URL-адресами ввода afaik. Вы можете отвечать на загрузки с помощью лямбда-триггера и удалять большие объекты (или предупреждать пользователя или делать что-то еще).

2. Вы можете установить точный размер объекта, но вы не можете его ограничить (например, вы можете ограничить указанный URL-адрес объектом размером 5 МБ, но не для объекта размером не более 5 МБ), может ли это вам помочь?

Ответ №1:

Я впервые использовал S3-Signed-URLS и также был обеспокоен этим. И я думаю, что все эти подписанные URL-адреса немного болезненны, потому что вы не можете установить для них ограничение на максимальный размер объекта / загрузки.

Я думаю, что это что-то очень важное для загрузки файлов в целом, чего просто не хватает..

При отсутствии этой опции вы вынуждены решать эту проблему со временем истечения срока действия и т. Д. Это становится действительно грязным..

Но, похоже, вы можете использовать сегменты S3 также с обычными Post-запросами, для которых в их политике есть параметр content-length. Поэтому я, вероятно, в будущем обменяю свои подписанные URL-адреса на POST-Routes.

Я думаю, что для правильных, более крупных приложений это правильный путь. (?)

Что может помочь с вашей проблемой:

В JavaScript SDK есть метод / функция, которая предоставляет вам только метаданные объекта S3 (включая размер файла) без загрузки всего файла.

Это называется s3.headObject()

Я думаю, что после завершения загрузки AWS требуется некоторое время для обработки этого вновь загруженного файла, а затем он доступен в вашем корзине.

Что я сделал, так это установил таймер после каждой загрузки, чтобы проверить размер файла, и если он больше 1 МБ, он удалит файл. Я думаю, что для производства вы хотите записать это где-нибудь в БД. Мои имена файлов также включают идентификатор пользователя, который загрузил файл. Таким образом, вы можете заблокировать учетную запись после слишком большой загрузки, если захотите.

Это сработало для меня в javascript..

 function checkS3(key) {
  return new Promise((resolve, reject) => {
    s3.headObject(headParams, (err, metadata) => {
      console.log("setTimeout upload Url");
      if (err amp;amp; ["NotFound", "Forbidden"].indexOf(err.code) > -1) {
        // console.log(err);
        return reject(err);
        //return resolve();
      } else if (err) {
        const e = Object.assign({}, Errors.SOMETHING_WRONG, { err });
        // console.log(e);
        // console.log(err);
        return reject(e);
      }
      return resolve(metadata);
    });
  });
}
  

Комментарии:

1. Он запрашивает Java, а не javascript. Поэтому я думаю, что это не по теме

2. вот почему я сказал, что это js, также информация getheader, вероятно, также доступна в java (?)….