2013-07-12 3 views
0

Expressjs имеет промежуточное программное обеспечение для тела, которое может обрабатывать файлы-загрузки и может даже хранить их в каталоге, указанном в параметрах. Но в моем приложении я хочу хранить файлы в Amazon S3, поэтому я в основном хочу передать файл прямо на S3, не сохраняя его локально вообще.Настройка загрузки файлов Expressjs

Но проблема в проверке файла. Как я могу быть уверенным, что эти файлы - все изображения. Проверка типа содержимого не является достаточным вариантом coz, который можно подделать. Я хочу знать, нормально ли, если я сделаю проверку после потоковой передачи файла на S3 ?? Я спрашиваю с точки зрения безопасности.

После сохранения изображения мне нужно получить его для создания миниатюр, как я могу сделать это асинхронно после отправки ответа после загрузки файла?

ответ

0

У вас есть противоречивые цели, не желающие хранить его локально во время загрузки, а затем также хотите загрузить его снова, чтобы сделать эскизы. Если вы хотите получить награды за технические слайки, вы можете одновременно передать тело запроса на загрузку файла в локальный временный файл, а также на S3. Или вы можете делать то, что делает остальная часть отрасли, и хранить ее в локальном временном файле, а затем уменьшать ее, а затем загружать все размеры в S3. Любой из этих подходов устраняет необходимость немедленно загрузить его с S3 для создания эскизов.

Как именно вы намерены подтвердить, что это действительно изображение? Вы можете посмотреть первый фрагмент данных файла и подтвердить для the file type's magic number, если это дает вам теплые пушистики, но в конечном итоге это ненадежные пользовательские данные. Вторая половина предполагаемого файла изображения может быть кодом вируса, и это также легко подделано в заголовке Content-Type. Похоже, что ваши проблемы с безопасностью в основном обусловлены FUD, в отличие от конкретных угроз, которые вы намерены защищать. Пока вы не берете загруженные пользователем данные, отметьте его исполняемым файлом и запустите его как root на своем сервере, любые данные без изображения просто будут повреждены и не будут корректно отображаться в браузере (и/или вызвать thumbnailer для выхода с ошибкой или, возможно, сбой в крайнем случае).

Что касается проверки, могу ли я просто попытаться создать эскиз, и если я не могу, то это не допустимое изображение и его удалить. Так ли это хорошо?

Часто, да. Будут граничные случаи, когда ваш thumbnailer не может обработать изображение, но браузер может, поскольку thumbnailers не идеальны, а некоторые изображения частично повреждены. Например, я нашел несколько анимированных GIF-файлов, которые визуализируют и улучшают анимацию в веб-браузере, но graphicsmagic падает, пытаясь их обработать. Не уверен, что есть что-то, что можно сделать о тех случаях, когда вы делаете ошибки в 0.01%.

И для загрузки части, могу ли я отправить ответ пользователю, а затем продолжить создание миниатюр и сохранить его в S3?

Да, это, как правило, лучший подход, так что пользователь знает, что его загрузка удалась. Обычно обработка изображений обычно создается как модель «рабочая очередь», где вы просто записываете, что есть работа, и затем продолжайте, а отдельный процесс или процессы отработают от очереди и завершите ее.

+0

Что касается проверки, могу ли я просто попытаться создать миниатюру, и если я не могу, то это не допустимое изображение и удалит его. Так ли это хорошо? –

+0

И для загрузки части, могу ли я отправить ответ пользователю, а затем продолжить создание миниатюр и сохранить его в S3? –

Смежные вопросы