Я пытаюсь переделать загрузку для моего приложения, чтобы перейти от:
- Клиент загружает файл в API
- API загружает файл в S3
to
- Клиент запрашивает предварительно подписанный URL-адрес у API
- API создает и отвечает URL-адресом
- Клиент загружает на 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 и убедиться, что он правильный?