загрузка файлов с использованием express.js и узла, ограничение расширений

Я работаю над обработкой загрузки файлов с использованием express.js и узла, и у меня работают основные функции. Что мне нужно, так это реализовать некоторые меры безопасности, а именно ограничить загрузку определенными форматами (PNG, JPEG). Есть ли простой способ разрешить только определенные форматы? Это пошло бы в парсере тела?

app.use(express.bodyParser({
    uploadDir: __dirname + '/public/uploads',
    keepExtensions: true   }));

app.use(express.limit('4mb'));

Есть ли какие-либо другие меры безопасности, которые я должен принять во внимание? Это хорошая идея, чтобы стереть данные EXIF с изображения?

Спасибо,

Бен

Ответы на вопрос(2)

В вашем промежуточном программном обеспечении

    if (req.files[key].type != 'image/png' && req.files[key].type != 'image/jpeg'){
      res.send(403);
    } else {
      next(); 
    }

обновление: это на самом деле не останавливает загрузку файла.

Решение Вопроса

документация для подключенияbodyParserлюбые параметры также передаютсягрозный, который делает фактический анализ формы.

В соответствии сгрозные документыВы можете передать свой собственныйonPart обработчик:

incomingForm.onPart(part)

You may overwrite this method if you are interested in directly accessing the multipart stream. Doing so will disable any 'field' / 'file' events processing which would occur otherwise, making you fully responsible for handling the processing.

incomingForm.onPart = function(part) {
  part.addListener('data', function() {
    // ...
  });
}

If you want to use formidable to only handle certain parts for you, you can do so:

incomingForm.onPart = function(part) {
  if (!part.filename) {
    // let formidable handle all non-file parts
    incomingForm.handlePart(part);
  }
}

Взятые вместе, вы должны быть в состоянии сделать что-то вроде этого:

function onPart(part) {
    if(!part.filename || part.filename.match(/\.(jpg|jpeg|png)$/i)) {
        this.handlePart(part);
    }
}

app.use(express.bodyParser({onPart: onPart});

Предупреждение. Я не проверял ничего из этого.

 12 июл. 2012 г., 22:08
Ох, и вы, вероятно, должны сделатьthis.handlePart(part) для тех случаев, когда нет имени файла - я обновил ответ.
 bento12 июл. 2012 г., 21:40
Это здорово, Линус, и похоже на работу. Два вопроса: (1) лучше ли сравнивать тип контента с именем файла? (2) Как мне обращаться с неподдерживаемыми форматами? Else {res.send (403)}?
 bento12 июл. 2012 г., 22:15
Хорошо знать. Похоже, что грозный просто игнорирует файл, когда он не соответствует расширению. Но все равно было бы неплохо сообщить об этом остальной части моего приложения и соответствующим образом отправить ответ.
 12 июл. 2012 г., 22:06
Я не был уверен, что было доступно вpart, но если у вас есть тип контента, я бы сравнил его с этим. Что касается того, как бы вы сделали дляelse Я не уверен, какие варианты у вас есть. Вы действительно не имеете доступа кres там, и я не знаю, как это грозит. В моем примере выше, яthink это просто проигнорирует файл.

Ваш ответ на вопрос