Как вы применяете Content-Type в предварительно подписанных сообщениях S3? - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь переделать загрузку для моего приложения, чтобы перейти от:

  1. Клиент загружает файл в API
  2. API загружает файл в S3

to

  1. Клиент запрашивает предварительно подписанный URL-адрес у API
  2. API создает и отвечает URL-адресом
  3. Клиент загружает на S3

Единственное, с чем я борюсь, это ограничением того, какие файлы можно загружать.Мы хотим разрешить загрузку изображений и видео, но не потенциально опасных файлов, таких как исполняемые файлы.Я пытался использовать Bucket Policy для принудительного применения $Content-Type из video/mp4, но я все еще могу загружать изображения.Вот как я генерирую URL (в данном случае PHP, в основном взятый из S3 docs ):

$formInputs = ['acl' => 'public-read', 'key' => 'test1.mp4', 'Content-Type' => 'video/mp4'];
$options = [
    ['acl' => 'public-read'],
    ['bucket' => $bucket],
    ['key' => 'test1.mp4'],
    ['eq', '$Content-Type', 'video/mp4']
];
$expires = '+2 hours';
$postObject = new \Aws\S3\PostObjectV4(
    $client,
    $bucket,
    $formInputs,
    $options,
    $expires
);

После подключения $postObject->getFormInputs() к Postman и размещения изображения какфайл, он принимает загрузку.Если я запрашиваю файл у S3, я могу получить к нему доступ, однако он возвращается с Content-Type: video/mp4 и не воспроизводится в браузере;но я все еще могу загрузить файл, который, кажется, не имеет смысла.

Кажется, что эта опция только требует, чтобы поле было включено во входные данные формы (если я удаляю поле Content-Type извходы, это не удается).Заголовок Content-Type кажется совершенно неактуальным, как и фактический тип mime-файла.Если это так, это правило кажется невероятно бесполезным для POST / PUT (может быть, в меньшей степени для GET).

Можно ли ограничить тип файла, который можно загружать, не полагаясь на данные, которыеотправлено в форме ввода?Или мне нужно проверить файл после загрузки в приложении или в Lambda и убедиться, что он правильный?

1 Ответ

1 голос
/ 24 сентября 2019

Политика контролирует только то, что разрешено / требуется в форме.Изменение / удаление полей приводит к ошибке, поскольку загрузка больше не соответствует политике.Нет никакой проверки того, являются ли загруженные данные фактически указанными Content-Type.

. Если вам нужно их проверить, вы должны проверить их по факту - в вашем приложении или в Lambda, так какВы предложили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...